线程的生命周期
1、实现Callable接口
class MyThread implements Callable{
@Override
public Integer call() throws Exception {
System.out.println("callable");
return 0;
}
}
2、实现runnable接口
class MyThread2 implements Runnable{
@Override
public void run() {
System.out.println("runnable");
}
}
3、继承Thread
class MyThread3 extends Thread{
@Override
public void run() {
System.out.println("thread");
}
}
runnable与callable的差异
1、实现方法不同
2、是否抛异常
3、有无返回值
启动线程的方式
public static void main(String[] args) throws Exception {
//实现runnable接口
new Thread(new MyThread2()).start();
//继承Thread
new MyThread3().start();
//实现callable
FutureTask<Integer> futureTask = new FutureTask(new MyThread());
new Thread(futureTask,"A").start();
Integer o = futureTask.get();
System.err.println((Integer)o);
}
设置线程优先级 setPriority 数值越大 优先级越高
就绪状态的线程,高优先级的会先被执行
线程调度策略(会因为系统而有差异)
抢占式调度策略 时间片轮转调度策略
对于不确定循环次数的线程,采用设置标志位的方式,结束线程。
让线程从运行到就绪 调用yield 只能让给同优先级或者高优先级的线程。因为高优先级
的线程到就绪状态后,又会进入运行状态
从运行状态到阻塞状态
1、调用sleep方法
2、做了io操作,比如等待键盘输入
3、调用wait
4。调用join 等待另一个线程执行完毕,再执行