并发编程 常见方法


----------------------------------------------------------------------------------------------------------------------------------------
sleep与yield:

------
sleep:
睡眠结束后的线程会由阻塞态变为就绪态,等待CPU的调度
正在睡眠的A线程可以由其他线程调用 A.interrupt()方法打断A的睡眠,即把正在睡眠的A线程叫醒,这时A线程的sleep方法会抛出InterruptedException
例如:

yield:
调用yield就是 让出CPU的使用权,等待CPU的调度
-------------------------------------------------------------------------------------------------------------------------------------------
线程优先级:1到10,默认是5
数字越大,优先级越高
------------------------------------------------------------------------------------------------------------------------------------------
join():等待线程运行结束。a.join():让这个代码所在的线程 等待a线程运行结束
Java中,主线程创建一个线程t1,主线程调用t1.join(),主线程是阻塞了吗?
是的,主线程在执行 t1.join() 后会立即被阻塞,也就是说主线程不会继续执行下面的代码了,直到t1线程运行结束为止。这是因为 join() 方法的作用是让当前线程(这里指主线程)等待调用 join() 方法的线程(这里指t1线程)执行完毕。
具体来说,当主线程调用 t1.join() 后,它会暂停执行,直到线程t1执行完毕才会继续执行。这种机制通常用于等待某个线程完成其任务后再进行后续操作,确保线程执行顺序的同步性。
在调用 t1.join() 后,主线程确实会被阻塞,直到线程t1执行完毕。一旦线程t1执行完毕,主线程会被重新加入到可执行线程队列中,并且由操作系统的CPU调度器决定何时再次执行主线程的代码。
具体来说:
1.主线程阻塞: 主线程调用 t1.join() 后,它会等待线程t1执行完毕。在这个等待过程中,主线程的执行会暂停,即被阻塞。
2.t1执行完毕: 当线程t1的任务执行完毕,t1会自动退出。此时,主线程的 join() 方法返回,主线程的阻塞状态解除。
3.主线程再次执行: 主线程解除阻塞后,会被重新加入到可执行线程队列中。操作系统的CPU调度器会根据调度策略决定何时再次调度主线程的执行。主线程并不会立即开始执行,而是由CPU调度器安排执行的时间。
总结来说,主线程在调用 t1.join() 后会被阻塞,直到t1执行完毕后解除阻塞。解除阻塞后,主线程会进入就绪态,重新参与到CPU的调度中,等待下次被分配执行的机会。
如果想等待多个线程运行结束,可以调用多个线程的join()方法:
t1.join();
t2.join();
-----------
join(long n):等待线程运行结束,最多等待n毫秒,如果n毫秒后,线程还没有结束,就不会再等了,接着执行join下面的代码。
join(3000):等待3000毫秒,如果那个线程在3000毫秒之内运行完了,也就不再等了
-----------------------------------------------------------------------------------------------------------------------------------
interrupt:打断正在睡眠(或阻塞)的线程,或者打断其他正在运行的线程
处于阻塞状态的线程:调用了sleep、wait、join方法(join的底层原理就是wait)
interrupt打断被阻塞的线程(sleep、wait、join),会抛异常,以异常的方式表示被打断了,打断后会有一个打断标记,表示你这个线程是否被其他线程打断过。
sleep、wait、join的线程被打断后,会把打断标记重置为false;正常运行的线程被打断后,打断标记就是true,例如:

-------------
interrupt打断正常运行的线程,打断标记变为true,但实际上被打断的线程还会继续执行,不受影响。我们可以判断打断标记是否为true,如果是的话就让线程自己结束运行,例如:

---------
注:
在 Java 中,改变线程的打断标记(interruption status)的唯一方法是通过调用 Thread.interrupt() 或 Thread.interrupted()
因此,除了 Thread.interrupt() 和 Thread.interrupted(),其他方法(如 Thread.park()、Thread.unpark() 和 Thread.isInterrupted())都不会改变打断标记
浙公网安备 33010602011771号