一丶实现线程的第二种方式?
1.编写一个类实现Runnable接口,见图一。
2.实现接口以后可以继承其他类,所以实现接口的方式更为推荐。
二丶采用匿名内部类的方式实现多线程?
1.见图二
三丶关于线程的生命周期?
1.刚new出来的线程为新建状态 > 调用start方法后线程为就绪状态(可运行状态,具有抢夺cpu时间片,也称cpu执行权力) > run方法执行标志着线程进入运行状态 > 当给与的cpu时间片运行结束后如若run方法未结束则继续回到就绪状态重复此操作 > 死亡状态。
2.线程在就绪和运行中一直切换,多线程并发是给人的一种错觉,只是计算机的计算速度非常快。
3.运行状态在遇到阻塞事件会进入阻塞状态,阻塞状态由运行状态转变过去。例如接收用户键盘输入或者sleep的时候,进入阻塞状态的线程会放弃之前所占用的cpu时间片,当阻塞状态解除后会回到就绪状态抢夺cpu时间片。
4.新建状态 > 就绪状态 > 运行状态 > 阻塞状态 > 死亡状态。
四丶回顾!
public class Test01 {//图一
public static void main(String[] args){
//创建一个可运行的对象
MyRunnable myRunnable = new MyRunnable();
//将创建的对象封装成一个线程对象
Thread t = new Thread(myRunnable);
//该对象在去调用start方法去开辟多线程,采用接口的方式去实现多线程
//合并格式:Thread t = new Thread(new MyRunnable);
t.start();
for(int i = 0;i <= 100;i++){
System.out.println("主》》》》》》》》》》" + i);
}
}
}
//第二种方式该类去实现Runnable接并实现run方法,那么这个方式属于并行并发的多线程结构
class MyRunnable implements Runnable{
@Override
public void run() {
for(int i = 0;i <= 100;i++){
System.out.println("线程》》》》" + i);
}
}
}
public class Test02 {//图二
public static void main(String[] args){
//这里面的匿名类没有名字,并不是new的Runnable接口
Thread t = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0;i <= 100;i++){
System.out.println(i);
}
}
});
t.start();
for(int i = 0;i <= 100;i++){
System.out.println("----" + i);
}
System.out.println("over!");
}
}