Android开发经验谈Android开发

Java线程的常用知识

2019-03-20  本文已影响8人  AnonyPer

之前梳理了进程和线程的概念以及如何创建、结束进程和线程,本文总结一下线程使用过程中的知识点:

生命周期及状态变迁

状态过程相关注意事项

public class ThreadTest {
    public static void main(String[] args) {
        FutureTask futureTask = new FutureTask(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                sleep(50000);
                System.out.println("FutureTask 等待50秒后返回100");
                return 100;
            }
        });
        Thread thread = new Thread(futureTask, "futureTask");
        thread.setDaemon(true);
        thread.start();
        System.out.println("主线程执行完毕");
    }

}

//执行结果:

主线程执行完毕

Process finished with exit code 0

线程sleep和yield方法区别

public class ThreadTest {
    public static void main(String[] args) {
        SellRunnable sellRunnable = new SellRunnable();
        Thread thread1 = new Thread(sellRunnable, "1");
        thread1.setPriority(1);

        Thread thread2 = new Thread(sellRunnable, "2");
        thread2.setPriority(5);

        Thread thread3 = new Thread(sellRunnable, "3");
        thread3.setPriority(5);
        thread2.start();
        thread1.start();
        thread3.start();
    }

}

class SellRunnable implements Runnable {
    //有十张票
    int index = 10;

    public synchronized void sell() {
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if(index>=1){
            index--;
            System.out.println("售货窗口:" + Thread.currentThread().getName() + "  卖出了一张票,剩余:" + index);
        }else{
            System.out.println("售货窗口:" + Thread.currentThread().getName() + " 买票时没票了");
        }

    }

    @Override
    public void run() {

        while (index > 0) {
            System.out.println("售货窗口:" + Thread.currentThread().getName() + " 开始买票");
            sell();
        }

    }
}

//执行结果:
售货窗口:2 开始买票
售货窗口:3 开始买票
售货窗口:1 开始买票
售货窗口:2  卖出了一张票,剩余:9
售货窗口:2 开始买票
售货窗口:1  卖出了一张票,剩余:8
售货窗口:1 开始买票
售货窗口:3  卖出了一张票,剩余:7
售货窗口:3 开始买票
售货窗口:3  卖出了一张票,剩余:6
售货窗口:3 开始买票
售货窗口:1  卖出了一张票,剩余:5
售货窗口:1 开始买票
售货窗口:2  卖出了一张票,剩余:4
售货窗口:2 开始买票
售货窗口:2  卖出了一张票,剩余:3
售货窗口:2 开始买票
售货窗口:2  卖出了一张票,剩余:2
售货窗口:2 开始买票
售货窗口:2  卖出了一张票,剩余:1
售货窗口:2 开始买票
售货窗口:2  卖出了一张票,剩余:0
售货窗口:1 买票时没票了
售货窗口:3 买票时没票了

Process finished with exit code 0  //可以看出,2、3执行的相对较多
    
    
//加入sleep 
@Override
    public void run() {

        while (index > 0) {
            try {
                Thread.sleep(100);
                System.out.println("售货窗口:" + Thread.currentThread().getName() + " 开始买票");
                sell();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

//执行结果:

售货窗口:1 开始买票
售货窗口:2 开始买票
售货窗口:3 开始买票
售货窗口:1  卖出了一张票,剩余:9
售货窗口:3  卖出了一张票,剩余:8
售货窗口:2  卖出了一张票,剩余:7
售货窗口:3 开始买票
售货窗口:2 开始买票
售货窗口:1 开始买票
售货窗口:3  卖出了一张票,剩余:6
售货窗口:1  卖出了一张票,剩余:5
售货窗口:2  卖出了一张票,剩余:4
售货窗口:3 开始买票
售货窗口:2 开始买票
售货窗口:1 开始买票
售货窗口:3  卖出了一张票,剩余:3
售货窗口:1  卖出了一张票,剩余:2
售货窗口:2  卖出了一张票,剩余:1
售货窗口:3 开始买票
售货窗口:2 开始买票
售货窗口:1 开始买票
售货窗口:3  卖出了一张票,剩余:0
售货窗口:1 买票时没票了
售货窗口:2 买票时没票了

Process finished with exit code 0  // sleep之后,各个窗口差不多
    

    
    
//加入yield
    
@Override
    public void run() {

        while (index > 0) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("售货窗口:" + Thread.currentThread().getName() + " 开始买票");
            sell();

            if ("2".equals(Thread.currentThread().getName())) {
                Thread.yield();
            }
        }
    }

//执行结果:

售货窗口:2 开始买票
售货窗口:3 开始买票
售货窗口:1 开始买票
售货窗口:2  卖出了一张票,剩余:9
售货窗口:2 开始买票
售货窗口:1  卖出了一张票,剩余:8
售货窗口:1 开始买票
售货窗口:3  卖出了一张票,剩余:7
售货窗口:1  卖出了一张票,剩余:6
售货窗口:3 开始买票
售货窗口:1 开始买票
售货窗口:3  卖出了一张票,剩余:5
售货窗口:3 开始买票
售货窗口:2  卖出了一张票,剩余:4
售货窗口:2 开始买票
售货窗口:3  卖出了一张票,剩余:3
售货窗口:3 开始买票
售货窗口:1  卖出了一张票,剩余:2
售货窗口:1 开始买票
售货窗口:3  卖出了一张票,剩余:1
售货窗口:3 开始买票
售货窗口:2  卖出了一张票,剩余:0
售货窗口:3 买票时没票了
售货窗口:1 买票时没票了

Process finished with exit code 0 // 2变少,相对3变多(执行太快,yield看不出效果)

以上!
进程与线程的创建和销毁
线程知识点总结
线程同步

上一篇下一篇

猜你喜欢

热点阅读