一、线程控制之休眠线程
sleep方法可以是线程休眠指定时间
package ThreadDemo;
import java.util.Date;
public class MyThreadOne extends Thread {
public void run(){
for(int i=0;i<200;i++){
System.out.println(getName()+" "+i+" "+ new Date());
try {
// 加入了线程休眠
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行上述代码,我们会发现,程序打印结果是一秒一次。这就证明了它有一秒的休眠时间。
二、线程控制之加入线程
join 加入线程类似于设置线程的优先级,但又比优先级厉害,join方法的文档是这样解释的:等待该线程终止。意思就是被调用join方法的线程,在其终止后,其它线程才可以抢占cpu
package ThreadDemo;
public class ThreadJoin extends Thread{
public void run(){
for(int i=0;i<200;i++){
System.out.println(getName()+" "+i);
}
}
}
package ThreadDemo;
public class ThreadDemo {
public static void main(String[] args) {
ThreadJoin tj1 = new ThreadJoin();
ThreadJoin tj2 = new ThreadJoin();
ThreadJoin tj3 = new ThreadJoin();
tj1.setName("a");
tj2.setName("b");
tj3.setName("c");
tj1.start();
// join方法须在start方法之后
try {
tj1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
tj2.start();
tj3.start();
}
}
运行代码,我们会发现,线程a运行结束后,线程b与线程c才开始,并且是在抢占cpu
三、线程控制之礼让线程
线程礼让的效果是让多个线程的执行更和谐,更倾向于平均化。
package ThreadDemo;
public class ThreadYield extends Thread {
public void run(){
for(int i=0;i<200;i++){
System.out.println(getName()+" "+i);
Thread.yield();//线程礼让
}
}
}
package ThreadDemo;
public class ThreadDemo {
public static void main(String[] args) {
ThreadYield ty1 = new ThreadYield();
ThreadYield ty2 = new ThreadYield();
ty1.setName("a");
ty2.setName("b");
ty1.start();
ty2.start();
}
}
四、线程控制之守护线程
守护线程是为主线程守护的,当主线程消失后,守护线程也将消失,当只有守护线程的时候,jvm退出。
setDaemon方法可将线程标记为守护线程,该方法须在start之前。
package ThreadDemo;
public class ThreadDaemon extends Thread {
public void run(){
for(int x=0;x<100;x++){
System.out.println(getName()+":"+x);
}
}
}
package ThreadDemo;
public class ThreadDemo {
public static void main(String[] args) {
ThreadDaemon td1 = new ThreadDaemon();
ThreadDaemon td2 = new ThreadDaemon();
td1.setName("关羽");
td2.setName("张飞");
td1.setDaemon(true);
td2.setDaemon(true);
td1.start();
td2.start();
Thread.currentThread().setName("刘备");
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
运行程序我们会发现,当刘备线程结束后,张飞关羽线程也随之结束。因为张飞,关羽是刘备的守护线程。
五、线程控制之中断线程
stop() 简单粗暴,直接杀死线程
interrupt() 相当于抛出个异常,使捕获异常后面的代码执行,然后结束线程。
package ThreadDemo;
import java.util.Date;
public class ThreadStop extends Thread{
public void run(){
System.out.println("开始:"+new Date());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println("interrupted here");
//e.printStackTrace();
}
System.out.println("结束:"+new Date());
}
}
package ThreadDemo;
public class ThreadDemo {
public static void main(String[] args) {
ThreadStop ts = new ThreadStop();
ts.start();
try {
Thread.sleep(3000);
// ts.stop();
ts.interrupt();//两者都可以使用,只是看自己需求如何了,它俩在结束时的处理不一样
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}