目录
一.继承Thread类,重写run()+start()
注意 继承父类->单继承
run方法不能抛出异常,没有返回值
2.实现Runnable接口,重写run()+start()-->推荐:简单,优点
3.juc包下Callable接口,重写call方法
public class Class001_Thread extends Thread{
//run()方法中定义线程体
@Override
public void run() {
for(int i = 1;i<=20;i++){
System.out.println("喝咖啡...");
/* try {
Thread.sleep(2); //毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}*/
}
}
public static void main(String[] args) {
//创建线程
Class001_Thread th = new Class001_Thread();
//开启线程
th.start();
//th.run(); 普通方法的调用,不是线程的开启
//主线程
for(int i = 1;i<=20;i++){
System.out.println("讲课...");
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
二.实现Runnable接口,重写run()方法
优点:
接口可以多实现,类只能单继承 实现资源共享
public class Class004_Thread implements Runnable{
public static void main(String[] args) {
//真实角色
Class004_Thread ct = new Class004_Thread();
//创建一个线程
//代理角色
Thread th = new Thread(ct);
//开启线程
th.start();
/*
//真实角色
Manager manager = new Manager();
//代理角色
Hr hr = new Hr(manager);
hr.addUser();*/
for(int i=0;i<50;i++){
System.out.println("一边上厕所!!!!");
}
}
/*
定义线程体
不能抛出异常
不返回结果
*/
@Override
public void run() {
for(int i=0;i<50;i++){
System.out.println("一边打游戏!!!");
}
}
}
三.juc下Callable接口,重写call()
优点:call方法可以抛出异常可以定义返回值
缺点:使用复杂麻烦
public class Class007_Racer implements Callable<Integer> {
//胜利者
private String winner = null;
/*
参赛者
*/
@Override
public Integer call() throws InterruptedException {
//每一个参赛者都要跑100步结束
for(int step = 1;step <= 100; step++){
//判断是否为兔子,并且步数是否为10的倍数
if("pool-1-thread-1".equals(Thread.currentThread().getName()) && step%10==0){
Thread.sleep(10);
}
System.out.println(Thread.currentThread().getName()+"正在跑第"+step+"步");
Thread.sleep(2);
//结束的条件判断
if(checkOver(step)){
return step;
}
}
return null;
}
/**
* 决定线程是否结束
* @param step 步数
* @return 当前线程是否结束执行
* true->结束执行
* false ->继续执行
*/
public boolean checkOver(int step){
//是否已经有人赢了
if(winner!=null){
return true;
}
//当前线程是否赢了
if(step==100){
winner = Thread.currentThread().getName();
return true;
}
return false;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
//1.创建1场比赛
Class007_Racer racer = new Class007_Racer();
//2.
// 1)创建执行服务
// 固定大小线程池->2
ExecutorService server = Executors.newFixedThreadPool(2);
// 2)提交执行
Future<Integer> f1 = server.submit(racer);
Future<Integer> f2 = server.submit(racer);
//3) 获取执行结果
Integer i1 = f1.get();
Integer i2 = f2.get();
System.out.println(i1);
System.out.println(i2);
//3.比赛
server.shutdown();
}
}
四.线程状态
1.新生状态:
new Thread(),new的时候就是一个线程进入新生状态
2.就绪状态:
start()一个线程就会进入到就绪状态,进入就绪队列进行等待,可以等待cpu的调度
3.运行状态:
当cpu调用调度到就绪列队中的某一个线程,这个线程开始进入运行状态
4.阻塞状态:
线程无法正常执行,可能会进入到阻塞状态
5.终止状态:
线程执行完毕
五.线程状态
1.一个线程如何进入到就绪状态:
1.start()
2.线程切换:被切换的线程恢复到就绪状态,等待下一次被调用
3.阻塞解除
4.yield()礼让线程
2.进入阻塞状态的方式:
1.sleep()
2.join()
3.wait()
4.IO等
3.进入终止状态的方式:
1.stop()终止方法-->不推荐使用-->比较暴力手法
2.通过添加表示判断
注意:
1.一个线程一旦执行完毕,不能恢复,重新new,也是新的线程
2.阻塞解除无法直接恢复到运行状态,会恢复到就绪状态,等待下一次被cpu调度
686

被折叠的 条评论
为什么被折叠?



