线程的创建方式
1.继承Thread类
扫地线程类继承Thread类
/*** 扫地线程* @author Administrator**/public class SaodiThread extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("扫地的任务!!!!");}}
主方法
public class MainEnter {/*** 主方法* @param args*/public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("主线程开启");// study01();study02();System.out.println("主线程结束");}/*** Thread子类方式*/private static void study02() {// TODO Auto-generated method stub//定义实例Thread t1 = new SaodiThread();Thread t2 = new ChaboliThread();//开启线程t1.start();t2.start();}/*** 匿名内部类方案*/private static void study01() {// TODO Auto-generated method stub//默认创建一个线程(匿名内部类)Thread t1 = new Thread() {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("输出" + this.getName());}};Thread t2 = new Thread() {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("输出" + this.getName());}};//启动线程t1.start();t2.start();}}
2.实现Runnable接口
扫地任务类实现Runnable接口
/*** 扫地任务* @author Administrator**/public class SaodiTask implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("扫地的任务!!!!");}}
主方法
private static void study02() {// TODO Auto-generated method stub//定义实例(方式一) 此方法与实现类有关// Thread t1 = new Thread(new SaodiTask());// Thread t2 = new Thread(new SaodiTask());//定义实例(方式二) 此方式与实现类无关Thread t1 = new Thread(() ->{System.out.println("开启扫地任务");});Thread t2 = new Thread(() ->{System.out.println("开启搽玻璃任务");});//开启线程t1.start();t2.start();}
3.两者的比较
1)实现Runnable接口的方式,可以把线程和任务进行分离,更能精准的操作
2)继承Thread类会是该类无法继承其他父类,而实现Runnable接口可以避免这个问题
3)实现Runnable接口的实现类中,不能使用Thread类中的方法
线程的优先级
每个线程在创建时,都有默认的优先级(5),我们也可以设置每个线程的优先级,最大值:10,最小值:1
设置优先级并不能控制线程执行的顺序,改变优先级只是在改变线程被CPU选中执行的概率

例
public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("主线程开启!!!!");Thread t1 = new Student();Thread t2 = new Game();Thread t3 = new Thread(new Video());//设置线程的优先级()t1.setPriority(10);t2.setPriority(6);t3.setPriority(8);//启动t1.start();t2.start();t3.start();//输出线程的优先级System.out.println(t1.getPriority());System.out.println(t2.getPriority());System.out.println(t3.getPriority());System.out.println("主线程结束!!!!");}}
执行结果:
主线程开启!!!!1068主线程结束!!!!我要打游戏!!!!看小视频!!!!!我要学习!!!
Thread类的常用API
private static void study04() {// TODO Auto-generated method stub//定义一个线程,任务:抽烟 线程的名字:蒲老师Thread t1 = new Thread(()->{System.out.println("正在执行的任务:抽烟");},"蒲老师");//设置优先级t1.setPriority(8);System.out.println(t1.getPriority());//获取线程的IDSystem.out.println("线程ID:" + t1.getId());try {//休眠5秒钟(时间到了,自动苏醒)Thread.sleep(5000);//单位是毫秒} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//给线程定义一个名称// t1.setName("蒲老师");System.out.println("线程名称:" + t1.getName());System.out.println("线程的状态:" + t1.getState());System.out.println("判断线程是否被激活:" + t1.isAlive());System.out.println("当前正在执行的线程:" + Thread.currentThread());//开启线程t1.start();System.out.println("线程的状态:" + t1.getState());//关闭线程t1.interrupt();//t1.stop(); t1.destroy();//判断线程是否被中断System.out.println(t1.interrupted());System.out.println("线程的状态:" + t1.getState());}
线程的状态

New(新建):创建线程还没有开启的时候
Runnable(就绪):使用start()方法开启线程后,线程状态会从New变成Runnable
Running(执行):被CPU选择,开始执行任务,任务执行结束后,可能会回到Runnable状态继续等待选择
Blocked(阻塞):当线程内部调用sleep()和join()方法时,线程会进入Blocked状态
Dead(死亡):线程执行完毕,死亡
转变状态的方法
1.sleep()
sleep() 方法是 使线程休眠的方法,它将会让线程由Running 变为Blocked 状态,而且它在休眠期间,不会释放任何的线程资源 当休眠时间完毕之后,状态重新变为Runnable
public class StateThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 1; i <= 100; i ++) {
for(int j = 1; j <= 10000; j ++) {
System.out.println(this.getName() + "输出:你好!" + i*j );
}
try {
//休眠3秒钟(被阻塞:线程的状态:由Running 变为Blocked)
this.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("子线程执行完毕!!!!");
}
2.join()
join() 它是一个线程固定抢占CPU的方法,线程只要调用该方法,如果该线程被CPU选中,那么在它的执行时间范围内,CPU都不能被其他线程所持有
private static void study06() {
// TODO Auto-generated method stub
Thread t1 = new StateThread();
Thread t2 = new StateThread();
Thread t3 = new StateThread();
//启动
t1.start();
try {
//join()可以做到,让其他线程等待 被调用join()的线程,执行完毕之后,才可以继续机制
t1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
try {
//持久CPU的执行时间:为5秒钟
t2.join(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t3.start();
}
3.yield()
yield()方法,是一个可以移交运行权限的方法,它移交运行权利之后,它的状态不像sleep()处于阻塞,它是直接由Running 变成Runnable ,重新抢占CPU的执行权。
public class StateThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
for(int i = 1; i <= 100; i ++) {
for(int j = 1; j <= 10000; j ++) {
System.out.println(this.getName() + "输出:你好!" + i*j );
//移交当前线程的执行权(并立马可以抢回)
this.yield();
}
}
System.out.println("子线程执行完毕!!!!");
}
}
