1. 多线程基础

2020-08-11  本文已影响0人  说书的苏斯哈

线程常见方法

start()
sleep()
yield()

下面通过一个代码来看

 public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            int count = 0;
            @Override
            public void run() {
                for(;;){
                    log.debug("----- t1 > {}",count++);
                }
            }
        },"t1");
        Thread t2 = new Thread(new Runnable() {
            int count = 0;
            @Override
            public void run() {
                for(;;){
                    Thread.yield(); //线程t2让出时间片
                    log.debug("           ----- t2 > {}",count++);
                }
            }
        },"t2");
        t1.start();
        t2.start();
    }

上面的代码如果在线程t2中没有添加Thread.yield()方法,相当于两个线程公平竞争CPU时间片,所以从结果上来说差不多,但是如果在t2线程中添加了Thread.yield()方法,相当于t2线程让出了时间片,从结果上来看 相差挺大,但是从结果上也证实了上面的结论,1 让出时间片并不代表不会执行,2 一切取决于调度器的执行,正常情况会有影响

setPriority()

借用上面的线程代码 调用下面的语句

        t1.setPriority(Thread.MIN_PRIORITY);
        t2.setPriority(Thread.MAX_PRIORITY);
        t1.start();
        t2.start();

从结果上看并不明显,这有可能是测试电脑是多核的缘故,因此并不明显

join()
interrupt
park&unPark
wait&nofity
    Object object = new Object();
        synchronized(object){

            while(条件判断){
                try {
                    object.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            //do something
        }
    }

另外的线程使用notifyall()

守护线程

线程状态

从CPU层面上讲,是五种状态
从Java API层面上讲,是六种状态,这是Thread.State枚举定义的

线程状态之间的切换:

上一篇 下一篇

猜你喜欢

热点阅读