多线程
执行时候每次顺序都不一样。
创建多线程三种方法:
1.extends Thread类,重写它的run()
这个run()方法就是线程执行体,就是该线程将要做的事。
2.implements Runnable接口,重写它的run()方法,
需要把Runnable对象包装成Thread对象后在执行start(),因为Runnable接口没有start()方法
3.实现Callable接口(就是Runnable增强版)
重写call()方法(有返回值。可以声明抛出异常)
先把Callable包装成Runnable再包装成Thread
New-Runnable-Running-Blocked-Dead
sleep()是进入阻塞Blocked状态;yield()是进入就绪Runnable状态。
sleep yield区别:
sleep暂停后不管优先级 其他线程随机执行,yield后只会给优先级相同或更高的线程执行机会。
sleep后进入阻塞,就过阻塞时间后转入就绪,而yield直接进入就绪,可能刚调用yield就再次获得执行机会。
sleep抛出InterruptedException,yield么有。
建议用sleep
后台线程:Daemon Thread,如果所有前台线程都死亡了,则后台线程自动死亡
主线程不能被设置成守护线程。setDaemon(true)
执行时候每次顺序都不一样。
创建多线程三种方法:
1.extends Thread类,重写它的run()
这个run()方法就是线程执行体,就是该线程将要做的事。
2.implements Runnable接口,重写它的run()方法,
需要把Runnable对象包装成Thread对象后在执行start(),因为Runnable接口没有start()方法
3.实现Callable接口(就是Runnable增强版)
重写call()方法(有返回值。可以声明抛出异常)
先把Callable包装成Runnable再包装成Thread
New-Runnable-Running-Blocked-Dead
sleep()是进入阻塞Blocked状态;yield()是进入就绪Runnable状态。
sleep yield区别:
sleep暂停后不管优先级 其他线程随机执行,yield后只会给优先级相同或更高的线程执行机会。
sleep后进入阻塞,就过阻塞时间后转入就绪,而yield直接进入就绪,可能刚调用yield就再次获得执行机会。
sleep抛出InterruptedException,yield么有。
建议用sleep
后台线程:Daemon Thread,如果所有前台线程都死亡了,则后台线程自动死亡
主线程不能被设置成守护线程。setDaemon(true)
public class DaemonThread extends Thread
{
// 定义后台线程的线程执行体与普通线程没有任何区别
public void run()
{
for (int i = 0; i < 1000 ; i++ )
{
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args)
{
DaemonThread t = new DaemonThread();
// 将此线程设置成后台线程
t.setDaemon(true); //这里设置成守护线程,当主线程结束之后 jvm中只有守护线程在继续,所以就直接结束。
// 启动后台线程
t.start();
for (int i = 0 ; i < 10 ; i++ )
{
System.out.println(Thread.currentThread().getName()+ " " + i);
}
// -----程序执行到此处,前台线程(main线程)结束------
// 后台线程也应该随之结束
}
}
import java.util.*;
public class SleepTest
{
public static void main(String[] args) throws Exception
{
for (int i = 0; i < 10 ; i++ )
{
System.out.println("当前时间: " + new Date());
// 调用sleep方法让当前线程暂停1s。
Thread.sleep(1000); //如果不设置sleep时间就嗖的一下都执行完了
}
}
}