线程控制练习示例

static void sleep(long millis) 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。 

public class ThreadSleep extends Thread{
    @Override
    public void run() {
        for (int i =0;i<100;i++){
            //static void sleep(long millis) 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(getName()+","+i);
        }
    }
}

public class ThreadSleepDemo {
    public static void main(String[] args) {
        ThreadSleep ts1= new ThreadSleep();
        ThreadSleep ts2= new ThreadSleep();
        ThreadSleep ts3= new ThreadSleep();

        ts1.setName("曹操");
        ts2.setName("刘备");
        ts3.setName("孙权");

        ts1.start();
        ts2.start();
        ts3.start();
    }
} 

每一秒运行三个线程,但是先后顺序仍然是随机的。

void join() 等待这个线程死亡。

假设三个线程分别为:皇帝,皇子1和皇子2,那么在夺取皇位这件事情上的优先级是,只有皇帝死后,皇子1和皇子2才能争夺皇位。

public class ThreadJoin extends Thread{
    @Override
    public void run() {
        for (int i =0;i<100;i++){
            System.out.println(getName()+","+i);
        }
    }
}


public class ThreadJoinDemo {
    public static void main(String[] args) {
        //void join() 等待这个线程死亡。
        ThreadJoin th1 = new ThreadJoin();
        ThreadJoin th2 = new ThreadJoin();
        ThreadJoin th3 = new ThreadJoin();

        th1.setName("皇帝");
        th2.setName("皇子1");
        th3.setName("皇子2");

        th1.start();
        try {
            th1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        th2.start();
        th3.start();
    }
}

等到“皇帝”这个线程结束后,两个“皇子"线程才能运行。

 void setDaemon(boolean on) 将此线程标记为守护线程。当运行的唯一线程都是守护进程线程时,Java虚拟机将退出。 

将当前线程设置为主线程,将另外两个线程设置为守护线程,当主线程结束时,剩下运行的线程都是守护线程,此时JVM将退出。
public class ThreadSetDaemon extends Thread{
    @Override
    public void run() {
        for (int i =0;i<100;i++){
            System.out.println(getName()+","+i);
        }
    }
}


public class ThreadSetDaemonDemo {
    public static void main(String[] args) {
        //void setDaemon(boolean on) 将此线程标记为守护线程。当运行的唯一线程都是守护进程线程时,Java虚拟机将退出。
        ThreadSetDaemon tsd1 = new ThreadSetDaemon();
        ThreadSetDaemon tsd2 = new ThreadSetDaemon();

        Thread.currentThread().setName("主线程");
        tsd1.setName("线程1");
        tsd2.setName("线程2");

        //设置守护线程
        tsd1.setDaemon(true);
        tsd2.setDaemon(true);

        tsd1.start();
        tsd2.start();

        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+","+i);
        }
    }
}

当主线程运行结束时,线程1和线程2也会结束掉。

猜你喜欢

转载自www.cnblogs.com/pxy-1999/p/12793590.html