java并发编程原理-----线程

目录

上下文切换

java代码创建线程的两种方式

线程的五个状态

线程join方法

多线程之间的影响


上下文切换

CPU的每一个核心同一时刻只能执行一个线程,但是我们会发现电脑同一时刻现实会进行几千个线程,这就是cpu在快速的切换执行线程,由操作系统进行选择要执行的线程

先是操作系统进行决定要执行那个任务,然后再交给CPU

线程执行达到操作系统分配的时间之后,会保存当前的执行状态,从任务保存到下次在加载的过程是一次上下文切换

任务之间的切换是有额外的时间开销的,这个开销不会到一毫秒

java代码创建线程的两种方式

一种是继承接口,一种是new出来

public class Demo2 implements  Runnable{
    @Override
    public void run() {
        for(;;){
            System.out.println("t2");
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Thread t1 = new Thread(){
            @Override
            public void run() {
                for (;;){
                    System.out.println("t1");
                }
            }
        };
        Runnable x = new Demo2();
        Thread t2 = new Thread(x);

        t1.start();
        t2.start();

        for(;;){
            System.out.println("主线程");
        }
    }
}

线程的五个状态

  1. 新建状态(New):线程对象创建之后,但还没有开始执行。

  2. 就绪状态(Runnable):线程已经创建并且可以执行,但还没有获得CPU执行的机会。

  3. 运行状态(Running):线程正在执行任务。

  4. 阻塞状态(Blocked):线程暂时停止执行,因为它正在等待某个条件的发生(例如等待输入/输出完成、等待锁资源等)。

  5. 死亡状态(Dead):线程执行完其任务或被提前终止,进入结束状态。

细分为七种状态

java并发编程原理-----线程_第1张图片

线程执行的时候,什么时候执行和被分配到多少时间片都是不确定的,在windows中一般一次分配的时间是几毫秒到几十毫秒

线程join方法

加入了join方法后,线程A在执行到join方法的位置时会暂停,并等待线程B执行完毕后再继续执行。这样可以保证线程B的执行完成后,线程A再开始执行后面的代码。

如果两个线程都加上了join方法,它们之间的执行顺序不受对方的影响。它们会交替执行,具体的执行顺序取决于线程调度器的调度策略,以及线程的优先级设置。

需要注意的是,如果代码较短,在一个时间片内就执行完毕的情况下,可能不会明显地看到两个线程的交替执行。因为线程切换的时间损耗可能相对较大,而代码执行时间很短,线程可能会在很短的时间内执行完毕。

另外,join方法还可以传入一个可选的超时参数,指定等待的最长时间,如果超过该时间线程B还没有执行完毕,线程A会继续执行后续代码。

总而言之,使用join方法可以控制线程的执行顺序,确保某个线程在另一个线程执行完毕后再继续执行。但最终的执行顺序还是由线程调度器来决定,而且多线程的实际执行结果可能是不确定的,需要注意处理线程间的同步与共享资源的访问问题。

多线程之间的影响

多线程之间的影响可以包括以下几个方面:

  1. 竞争条件(Race Condition):当多个线程同时访问和修改共享数据时,由于执行顺序的不确定性,可能导致数据的不一致性。这种情况下,最终的结果可能与预期不符。

  2. 死锁(Deadlock):多线程程序中,如果线程之间存在循环等待资源的情况,就可能导致死锁。当发生死锁时,线程无法继续执行,导致程序无法正常运行。

  3. 数据竞争(Data Race):当多个线程同时读写共享数据时,可能会出现数据竞争的情况。如果没有正确的同步机制来保护共享数据,就可能导致数据的不确定性和错误。

  4. 上下文切换开销:多线程之间的切换需要保存和恢复线程的上下文信息,这个过程会带来一定的开销。当线程数量增多时,频繁的上下文切换可能会导致系统性能下降。

  5. 资源消耗:多线程程序可能会占用更多的系统资源,包括内存、CPU等。如果线程数量过多,可能会导致系统资源不足,影响整体性能。

为了避免多线程之间的影响,可以采取以下措施:

  1. 使用同步机制:例如互斥锁、信号量等,来保护共享数据的访问,避免竞争条件和数据竞争的发生。

  2. 避免死锁:设计合理的资源分配和释放策略,避免线程之间出现循环等待资源的情况。

  3. 使用线程安全的数据结构和算法:选择适合多线程环境的数据结构和算法,避免数据竞争和不一致性。

  4. 合理控制线程数量:根据实际需求和系统资源情况,控制线程的数量,避免过多的线程导致性能下降和资源消耗过大。

  5. 考虑使用线程池:通过线程池管理线程的创建和销毁,可以降低线程创建和上下文切换的开销,提高系统性能。

你可能感兴趣的:(java,开发语言)