1.sleep() 方法
让当前线程休眠指定的时间(毫秒)
让出cpu执行权,但是并没有释放这个线程拿到的锁
当前线程调用sleep方法,当前线程会进入阻塞态,在阻塞态中呆一段时间,就会进入就绪态
2.yield() 方法
使当前线程让出(释放)CPU执行时间片,与其他线程一起重新竞争CPU时间片。在一般情况下,优先级高的线程更有可能竞争到CPU时间片
也就是说,yield()方法会让当前线程从运行态进入就绪态
总结:
sleep():会让线程从运行态进入到阻塞态(在阻塞态呆一段时间),然后再进入就绪态
yield():会让线程直接从运行态进入到就绪态
3.wait() 方法
多个线程共用一把锁,哪个线程拿到锁了,在这个线程中使用obj.wait()方法,这个线程就是把锁释放出去,让其他被唤醒的线程抢这把锁,自己则进入等待队列中
也就是说三个线程状态:拿到锁,可能获得锁的状态,等待队列(无法获得锁)
- Thread t1 = new Thread( () ->
- {
- synchronized (obj)
- {
-
- }
- });
-
- Thread t2 = new Thread( () ->
- {
- synchronized (obj)
- {
-
- }
- });
-
- Thread t3 = new Thread( () ->
- {
- synchronized (obj)
- {
-
- }
- });
在哪个线程中调用obj.wait()方法,这个线程就让出锁,进入等待队列,直到其他线程中调用obj.notify()或者obj.notifyAll()方法,就可以竞争锁的占有权
4.notify方法和notifyAll方法
notify方法:唤醒在此对象监视器上等待的一个线程,如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的
notifyAll方法:用于唤醒在监视器上等待的所有线程
程序员甲和乙共用一块肥皂(锁),刚开始甲用了一会,然后调用了wait()方法,把肥皂交出去了,自己进入等待状态,乙拿到肥皂(锁)后,通过自己的notify()方法通知甲,告诉自己在用
然后乙把锁交出去,自己又进入等待队列中.....
5.join方法:线程的join方法:thread.join()_Pr Young的博客-CSDN博客
另外:
如何让线程停止:
不推荐使用JDK提供的stop(),destroy()方法,我们可以自己在线程类里面写一个stop方法
可以看到在run方法里面,只有当flag为true的时候才执行方法体,进行打印输出
本来是要执行1000次打印输出,但是执行到900次的时候,将调用我们写的线程的stop方法,将flag置为false,然后就不会再打印输出了
- public class Test implements Runnable
- {
- private boolean flag = true;
-
- @Override
- public void run()
- {
- int i = 0;
- while (flag == true)
- {
- System.out.println("Thread" + i);
- }
- }
-
- public void stop()
- {
- this.flag = false;
- }
- }
-
- //将下面两行代码合成一句代码:
- //Test temp=new Test();
- //Thread test=new Thread(temp);
-
- Thread test=new Thread(new Test());
-
- test.start();
-
- for(int i=0;i<1000;i++)
- {
- if(i==900)
- {
- test.stop();
- }
- }