美文网首页
java 线程比较

java 线程比较

作者: soulsoso | 来源:发表于2022-03-31 15:53 被阅读0次

1.Thread.sleep(long millis),一定是当前线程调用此方法,当前线程进入TIMED_WAITING状态,但不释放对象锁,millis后线程自动苏醒进入就绪状态。作用:给其它线程执行机会的最佳方式。

2.Thread.yield(),一定是当前线程调用此方法,当前线程放弃获取的CPU时间片,但不释放锁资源,由运行状态变为就绪状态,让OS再次选择线程。作用:让相同优先级的线程轮流执行,但并不保证一定会轮流执行。实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。Thread.yield()不会导致阻塞。该方法与sleep()类似,只是不能由用户指定暂停多长时间。

3.thread.join()/thread.join(long millis),当前线程里调用其它线程t的join方法,当前线程进入WAITING/TIMED_WAITING状态,它会释放thread实例的对象锁,但不会释放其它对象锁(包括main线程)。线程t执行完毕或者millis时间到。
解释如下:t2对象调用t1.join()实际上是将t1作为锁对象,调用t1.wait()方法,则此时t2会释放t1对象锁,同时t2进入waiting状态。而此时t1还是running状态。

@Slf4j(topic = "c.Test1")
public class Test2 {

    public static void  main(String [] args){
        Thread t1 =new Thread(new Runnable() {
            @Override
            public void run() {
                int a = 11;
                //模拟t1线程运行代码
                for (int i=0;i<1000000000;i++){
                   a = a+a%10;
                }
            }
        },"t1");

        Thread t2 =new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        },"t1");

        Thread t3 =new Thread(new Runnable() {
            @Override
            public void run() {
                log.debug("t1的运行状态{}",t1.getState());
                log.debug("t2的运行状态{}",t2.getState());
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                log.debug("t1的运行状态{}",t1.getState());
                log.debug("t2的运行状态{}",t2.getState());


            }
        },"t1");

        t1.start();
        t2.start();
        t3.start();
    }
}
image.png

4.obj.wait(),当前线程调用某一个作为锁的对象的wait()方法,当前线程释放对象锁,进入等待队列。依靠notify()/notifyAll()唤醒或者wait(long timeout) timeout时间到自动唤醒。

5.obj.notify()唤醒在此对象监视器上等待的单个线程,选择是任意性的。notifyAll()唤醒在此对象监视器上等待的所有线程。

6.LockSupport.park() / LockSupport.parkNanos(long nanos),LockSupport.parkUntil(long deadlines), 当前线程进入WAITING/TIMED_WAITING状态。对比wait方法,不需要获得锁就可以让线程进入WAITING/TIMED_WAITING状态,需要通过LockSupport.unpark(Thread thread)唤醒。

参考(https://blog.csdn.net/pange1991/article/details/53860651
仅供自己笔记使用,侵权删除。

相关文章

  • java 线程比较

    1.Thread.sleep(long millis),一定是当前线程调用此方法,当前线程进入TIMED_WAIT...

  • Java线程池解析

    参考文章:Java并发:线程池,饱和策略 前言 Java线程池的使用在工作中还是比较常见的,线程池可以减小线程建立...

  • Java多线程之原子性

    友情提示:作为一个java小白最近在看java多线程知识,东西还是比较多,推荐大家去看《Java多线程编程指南》,...

  • Java中守护线程的总结

    前言 在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用个比较...

  • Java线程Thread.yeild方法解析 精准

    Java线程Thread.yeild方法解析 Java线程Thread的yeild方法可能在日常使用中比较少出现,...

  • 用户线程和守护线程

    在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用个比较通俗的...

  • java中用户线程和守护线程

    在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用个比较通俗的...

  • Java中守护线程的总结(转)

    在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)用个比较通俗的比...

  • HashMap和HashTable的区别

    Java常见比较一 1.线程是否安全? HashMap 是非线程安全的,HashTable 是线程安全的;Hash...

  • kotlin 单利模式

    1. 懒汉式 java线程不安全 缺点是在多线程不能正常工作 线程安全 效率比较低 kotlin线程不安全 线程...

网友评论

      本文标题:java 线程比较

      本文链接:https://www.haomeiwen.com/subject/pkdnjrtx.html