线程方法的认识

作者 : icbug 发布时间: 2020-06-7 文章热度:115 共3243个字,阅读需9分钟。 本文内容有更新 手机浏览

线程方法的认识

上一篇文章说到一道面试题,那么我们来说一下上节课的答案

第一个:new.Thread().start

第二个:new Thread(Runnable).start()

第三个线程是我们的线程池:Executors .newCachedThreadPool()或者使用FutureTask+Callable

说完上一篇文章的答案,我们来看一下这一篇文章所要讲的内容

那么我们先来举一个例子


package cn.icbugblog.juc.c_000;

public class T03_Sleep_Yield_Join{
    public static void main(String[] args){
        //testSleep();
        //testYield();
        testJoin();
    }
    
}

写到这里之后我们需要知道一件事情,Sleep是如何复活的?

Sleep由你的睡眠时间而决定,等到睡眠到规定的时间后他会自动复活!

package cn.icbugblog.juc.c_000;

public class T03_Sleep_Yield_Join{
    public static void main(String[] args){
        //testSleep();
        //testYield();
        testJoin();
    }
    static void testSleep(){
        new Thread(()->{
            for (int i=0; i<100;i++){
                System.out.println("A"+i);
                try{
                        Thread.sleep(500);
                        //TimeUnit.Milliseconds.sleep(500)
                }catch (InterruptedException e){
                    e.printStackTrace();
                    
                }
            }
        }).start();
    }
}

写到这里我们需要知道,Yield就是我们当前线程正在执行的时候停止下来进入等待队列,回到等待队列里在系统的调度算法中还是依然有可能把你刚回去的这个线程拿回来继续进行执行,但是,更大的可能性是把原来等待的那些拿出一个来进行执行,所以yield的意思就是,我让出来这个CPU,后面的线程能不能抢到yield不管。

package cn.icbugblog.juc.c_000;

public class T03_Sleep_Yield_Join{
    public static void main(String[] args){
        //testSleep();
        //testYield();
        testJoin();
    }
    static void testSleep(){
        new Thread(()->{
            for (int i=0; i<100;i++){
                System.out.println("A"+i);
                try{
                    Thread.sleep(500);
                    //TimeUnit.Milliseconds.sleep(500)
                }catch (InterruptedException e){
                    e.printStackTrace();

                }
            }
        }).start();
    }
    static void testYield(){
        new Thread(()->{
            for(int i=0;i<100;i++){
                System.out.println("A"+i);
                if(i%10 == 0)Thread.yield();


            }
        }).start();

        new Thread(()->{
            for(int i=0;i<100;i++){
                System.out.println("--------B"+i);
                if (i%10 == 0)Thread.yield();
            }
        }).start();
    }
}

然后我们来了解一下join

join的意思就是在当前线程中增加Join()线程,本线程等待。等代调用的线程运行完毕后,自己再接着去运行。有t1t2两个线程,t1在某个点上调用了t2.join,它会跑到t2去运行,t1等待t2运行完成之后,再继续运行t1(join本身没有意义)

package cn.icbugblog.juc.c_000;

public class T03_Sleep_Yield_Join{
    public static void main(String[] args){
        //testSleep();
        //testYield();
        testJoin();
    }
    static void testSleep(){
        new Thread(()->{
            for (int i=0; i<100;i++){
                System.out.println("A"+i);
                try{
                    Thread.sleep(500);
                    //TimeUnit.Milliseconds.sleep(500)
                }catch (InterruptedException e){
                    e.printStackTrace();

                }
            }
        }).start();
    }
    static void testYield(){
        new Thread(()->{
            for(int i=0;i<100;i++){
                System.out.println("A"+i);
                if(i%10 == 0)Thread.yield();


            }
        }).start();

        new Thread(()->{
            for(int i=0;i<100;i++){
                System.out.println("--------B"+i);
                if (i%10 == 0)Thread.yield();
            }
        }).start();
    }
    static void testJoin(){
        Thread t1 = new Thread(()->{
            for (int i=0;i<100;i++){
                System.out.println("A"+i);
                try {
                    Thread.sleep(500);
                    //TimeUnit.Milliseconds.sleep(500)
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        });
        Thread t2 = new Thread(()->{

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

            }
            for (int i=0;i<100;i++){
                e.printStackTrace();
            }
        });
        t1.start();
        t2.start();
    }
}

这个就是我们常用的线程方法


预告:【Java多线程与高并发】线程的状态

The End....

The passage from https://icbugblog.cn

常见问题FAQ

本站资源是否全部免费?
本站文章和普通速度下载资源免费,高速下载资源和讲解视频需要成为SVIP才能查看哦!
本站采用标准 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明!
icbug创客 » 线程方法的认识

发表评论

CAPTCHAis initialing...