java锁的理解:https://www.cnblogs.com/dolphin0520/p/3923167.html
Thread join (millis) 当前线程等待目标线程死亡或收到中断信号,最多等待millis,millis为0 表示一直等到目标死亡。网上有的地方说需要两个线程是父子关系,是错误的。代码如下:
public class Test { public static void main(String[]args) { Thread thread1 = new Thread(new Runnable() { @Override public void run() { try{ Thread.sleep(100); }catch (InterruptedException e){ }finally { } System.out.println("thread 1 done"); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { try{ thread1.join(); // thread1.join(10); }catch (InterruptedException e){ }finally { } System.out.println("thread 2 done"); } }); thread2.start(); thread1.start(); } }
结果:
thread 1 done
thread 2 done
如果join方法传入参数是10,那么结果会是
thread 2 done
thread 1 done
yield方法:当前线程愿意让出cpu的使用权,但是调度器不保证一定会执行这个意愿。
可以在循环中使用,需要指定一个循环条件:
while (Thread.activeCount()>2) Thread.yield();
setDaemon(boolean)设置线程是否是守护线程,必须在start之前调用。守护线程的优先级比较低。
java中线程分为用户线程和守护线程。一个线程默认是用户线程。 当所有用户线程都结束(不准确,下面文档上描述的是running)后,JVM就会退出exits。GC线程是一个守护线程。如果有一个以上的线程处于运行状态,JVM不会退出。
守护线程可以用来处理某些周期性任务,或者响应某些事件。(我没有实际应用过)
* Marks this thread as either a {@linkplain #isDaemon daemon} thread * or a user thread. The Java Virtual Machine exits when the only * threads running are all daemon threads.
示例链接: https://www.cnblogs.com/shangxiaofei/p/8118813.html
interrupt, isInterrupted
java的线程中断是一种中断信号。它不会结束线程,而是标记一个中断状态(isInterrupted)或者抛出一个中断异常(InterruptedException)。如果线程阻塞在sleep、join等函数上,那么它会受到一个异常,同时中断状态会被清除,否则只标记了一个异常状态,没有清除。
io读写、获取锁不会被中断。lockInterruptibly 、tryLock方法尝试获取锁可以接受中断消息。
中断线程可以把被中断的线程从阻塞状态移开,由它自己决定要做什么,一个线程在受到中断消息之后(isInterrupted 或 InterruptedException)如何处理中断逻辑,是由他自己决定的。
一篇关于java线程中断的链接,有详细的例子:https://blog.csdn.net/sunxing007/article/details/9123363
java不推荐使用线程挂起和唤醒。