什么是线程
线程
如何声明一个线程
一共有三种方法:
- 继承Thread类
- 实现Runnable接口
严格意义上讲,通过实现Runnable接口声明的类不是一个线程类,实现该接口的类的作用是封装线程执行的业务逻辑 - 实现Callable来声明
对第三种方法的例子
public class MyCallableThread implements Callable<String>{
@Override
public String call() throws Exception {
System.out.println("MyCallableThread body .......");
Thread.sleep(3000);
System.out.println("MyCallableThread return....");
return "CHINA";
}
}
public class Test4 {
public static void main(String[] args) {
Callable<String> target=new MyCallableThread();
FutureTask<String> task=new FutureTask<>(target);
new Thread(task).start();
try {
System.out.println("tast return value:"+task.get(5, TimeUnit.SECONDS));
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
System.out.println("+++++++++++++++++++++++++++++++++++++");
}
}
如何启动线程
- 为什么通过start而不是run来启动线程
start是启动一个新的线程,而run是在main主线程执行,但是线程的入口在run方法,start可以调用run方法。 - 线程的生命周期:
1.新建状态:new
2.就绪状态:start
3.执行状态:占用cpu资源或者说该线程被cpu调度
4.阻塞状态:sleep(),yeild()从执行状态切换到就绪状态,join()进入阻塞,导致启动此线程的线程阻塞。
5.死亡状态:
public class FirstThread extends Thread{
@Override
public void run() {
System.out.println("=================FirstThread Begin=================");
for(int i=0;i<100;i++){
System.out.println("FirstThread *** "+i);
if(i%10==0){
/**
* 注意:仅仅是让渡执行权限,而不是把执行权限让给其他线程。
* 因为当当前线程把执行权限让渡出去过后,当前线程由执行状态切换到就绪状态
* 处于就绪状态的线程是可以被CPU调度的,也就是说,当前线程把执行权限让渡出来
* 接下来CPU依然可能继续调用该线程
* */
System.out.println("FirstThread让渡了执行权限....");
Thread.yield();
}
}
System.out.println("=================FirstThread End=================");
}
}
一个例子
public class HusbandThread extends Thread{
private WifeThread wife;
public HusbandThread(WifeThread wife) {
this.wife=wife;
}
@Override
public void run() {
System.out.println("老公开始做饭.....");
System.out.println("老公没有盐,让老婆去买盐....");
wife.start();
try {
wife.join(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("老公继续做饭.....");
}
}
public class WifeThread extends Thread{
@Override
public void run() {
System.out.println("老婆开始去买盐......");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("老婆盐买回来了....");
}
}
public class Test3 {
public static void main(String[] args) {
new HusbandThread(new WifeThread()).start();
}
}