目录
上下文切换
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("主线程");
}
}
}
线程的五个状态
-
新建状态(New):线程对象创建之后,但还没有开始执行。
-
就绪状态(Runnable):线程已经创建并且可以执行,但还没有获得CPU执行的机会。
-
运行状态(Running):线程正在执行任务。
-
阻塞状态(Blocked):线程暂时停止执行,因为它正在等待某个条件的发生(例如等待输入/输出完成、等待锁资源等)。
-
死亡状态(Dead):线程执行完其任务或被提前终止,进入结束状态。
细分为七种状态
线程执行的时候,什么时候执行和被分配到多少时间片都是不确定的,在windows中一般一次分配的时间是几毫秒到几十毫秒
线程join方法
加入了join
方法后,线程A在执行到join
方法的位置时会暂停,并等待线程B执行完毕后再继续执行。这样可以保证线程B的执行完成后,线程A再开始执行后面的代码。
如果两个线程都加上了join
方法,它们之间的执行顺序不受对方的影响。它们会交替执行,具体的执行顺序取决于线程调度器的调度策略,以及线程的优先级设置。
需要注意的是,如果代码较短,在一个时间片内就执行完毕的情况下,可能不会明显地看到两个线程的交替执行。因为线程切换的时间损耗可能相对较大,而代码执行时间很短,线程可能会在很短的时间内执行完毕。
另外,join
方法还可以传入一个可选的超时参数,指定等待的最长时间,如果超过该时间线程B还没有执行完毕,线程A会继续执行后续代码。
总而言之,使用join
方法可以控制线程的执行顺序,确保某个线程在另一个线程执行完毕后再继续执行。但最终的执行顺序还是由线程调度器来决定,而且多线程的实际执行结果可能是不确定的,需要注意处理线程间的同步与共享资源的访问问题。
多线程之间的影响
多线程之间的影响可以包括以下几个方面:
-
竞争条件(Race Condition):当多个线程同时访问和修改共享数据时,由于执行顺序的不确定性,可能导致数据的不一致性。这种情况下,最终的结果可能与预期不符。
-
死锁(Deadlock):多线程程序中,如果线程之间存在循环等待资源的情况,就可能导致死锁。当发生死锁时,线程无法继续执行,导致程序无法正常运行。
-
数据竞争(Data Race):当多个线程同时读写共享数据时,可能会出现数据竞争的情况。如果没有正确的同步机制来保护共享数据,就可能导致数据的不确定性和错误。
-
上下文切换开销:多线程之间的切换需要保存和恢复线程的上下文信息,这个过程会带来一定的开销。当线程数量增多时,频繁的上下文切换可能会导致系统性能下降。
-
资源消耗:多线程程序可能会占用更多的系统资源,包括内存、CPU等。如果线程数量过多,可能会导致系统资源不足,影响整体性能。
为了避免多线程之间的影响,可以采取以下措施:
-
使用同步机制:例如互斥锁、信号量等,来保护共享数据的访问,避免竞争条件和数据竞争的发生。
-
避免死锁:设计合理的资源分配和释放策略,避免线程之间出现循环等待资源的情况。
-
使用线程安全的数据结构和算法:选择适合多线程环境的数据结构和算法,避免数据竞争和不一致性。
-
合理控制线程数量:根据实际需求和系统资源情况,控制线程的数量,避免过多的线程导致性能下降和资源消耗过大。
-
考虑使用线程池:通过线程池管理线程的创建和销毁,可以降低线程创建和上下文切换的开销,提高系统性能。