首页 > 代码库 > 多线程-4
多线程-4
四、sleep 休眠、yield 礼让、join 加入、Daemon 后台(守护)、stop(过时)或interrupt 终止
1.线程的控制(常见方法)
A:休眠线程,使线程休眠millis时间后再次进入就绪状态,等待运行。
sleep(long millis) throws InterruptedException
B:加入线程,有个很好的例子是父与子,一定是现有父亲才有儿子,父线程运行完以后才会运行子线程。父线程在start方法之后调用 join() 方法。
public final void join():等待该线程终止。
C:礼让线程,期望达到线程轮流运行的效果时使用,不是百分百达到。
public static void yield():暂停当前正在执行的线程对象,并执行其他线程。
让多个线程的执行更和谐,但是不能靠它保证一人一次。
D:后台线程,守护线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。
public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。
E:终止线程(掌握),使用stop之后后续代码不会运行;使用interrupt会以异常抛出的方式对超时的线程进行处理。
public final void stop():让线程停止,过时了,但是还可以使用。
public void interrupt():中断线程。 把线程的状态终止,并抛出一个InterruptedException。
2.实例代码
A.休眠线程实例代码:
public class Thread4 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程 : " + getName() + "=" + i);
}
//sleep(long millis) throws InterruptedException 休眠
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
B:加入线程,有个很好的例子是父与子,一定是现有父亲才有儿子,父线程运行完以后才会运行子线程。父线程在start方法之后调用 join() 方法。
public class ThreadTest4 {
public static void main(String[] args) {
Thread4 th1 = new Thread4();
Thread4 th2 = new Thread4();
Thread4 th3 = new Thread4();
th1.setName("李源");
th2.setName("李世民");
th3.setName("李元吉");
//先有父才有子
th1.start();
//public final void join():等待该线程终止。
try {
th1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
th2.start();
th3.start();
}
}
C:礼让线程,期望达到线程轮流运行的效果时使用,不是百分百达到。
public class Thread4 extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程 : " + getName() + "=" + i);
}
// * public static void yield():暂停当前正在执行的线程对象,并执行其他线程。
// * 让多个线程的执行更和谐,但是不能靠它保证一人一次。
Thread.yield();
}
}
D:后台线程,守护线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。如果游戏,boss死掉以后剩下的小怪也会跟着一起死掉。大部分时候守护线程死掉需要些时间,所以可以看到只有守护线程的时候,守护线程会运行一段时间。
public class DeamonTEST {
public static void main(String[] args) {
Thread4 th1 = new Thread4();
Thread4 th2 = new Thread4();
th1.setName("张飞");
th2.setName("关羽");
//设置为守护线程
// * public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。
// * 当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。
th1.setDaemon(true);
th2.setDaemon(true);
th1.start();
th2.start();
Thread.currentThread().setName("刘备");
//主死臣随,如游戏
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "----------");
}
}
}
E:终止线程(掌握),使用stop之后后续代码不会运行;使用interrupt会以异常抛出的方式对超时的线程进行处理。
public class StopThread extends Thread {
@Override
public void run() {
System.out.println("线程开始" + new Date());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("线程被终止!");
}
System.out.println("线程结束" + new Date());
}
}
public static void main(String[] args) {
StopThread st = new StopThread();
st.start();
try {
Thread.sleep(1000);
st.stop();
// st.interrupt();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("有没有");
}
}
多线程-4