1,多线程
1.1多线程的定义
多任务执行,多路径执行
如果说没有多任务,就不需要使用多线程
进程与线程的关系
1.2创建多线程
方法1:继承Thread类,重写run()+start()
run()不能抛出异常,只能捕捉异常,没有返回值
public class Test02 extends Thread{
//重写run()方法
public void run(){
for(int i=0;i<=10;i++){
System.out.println("睡觉.....");
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Test02 test=new Test02();
//开启多线程
test.start();
for (int i=0;i<=10;i++){
System.out.println("打呼噜....");
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
方法2:实现Runnable接口,重写run()+start() ***
public class Test03 implements Runnable{
public static void main(String[] args) {
Test03 ts=new Test03();
Thread th=new Thread(ts);
//开启多线程
th.start();
for(int i=0;i<40;i++){
System.out.println("打呼噜....");
}
}
@Override
public void run() {
for(int i=0;i<=20;i++){
System.out.println("睡觉.....");
}
}
}
方法3:juc包下Callable接口,重写call()方法
public class Test05 implements Callable<Integer> {
public static void main(String[] args) throws InterruptedException, ExecutionException {
Test05 ts=new Test05();
ExecutorService server= Executors.newFixedThreadPool(1);
Future<Integer> f1 = server.submit(ts);
int a=f1.get();
System.out.println(a);
for(int i=0;i<=10;i++){
System.out.println("吃饱了吃饱了");
Thread.sleep(20);
}
}
@Override
public Integer call() throws Exception {
int s=0;
for(int i=0;i<=10;i++){
System.out.println("饿死了");
s++;
Thread.sleep(20);
}
return s;
}
}
注意:在定义线程体时,可以通过内部类,局部内部类,或者匿名内部类来定义
例如:
//使用接口Runnable来定义多线程时,通常是
Test03 ts=new Test03();
Thread th=new Thread(ts);
//如果换成使用匿名内部类时
Test03 ts=new Test03();
Thread th=new Thread(new Runnable() {
@Override
public void run() {
System.out.println();
}
});
1.3:线程的状态
- 新生状态:new Thread(),new的时候就是一个线程进入新生状态
- 就绪状态:start()一个线程就会进入到就绪状态,进入就绪列进行等待,可以等待cpu的调度
- 运行状态:当cpu调用调度到就绪队列中的某个线程,这个线程开始进入运行状态
- 阻塞状态:线程无法正常执行,可能进入到阻塞状态
- 终止状态:线程执行完毕
一个线程如何进入到就绪状态:
- start()
- 线程切换:被切换的线程恢复到就绪状态,等待下一次被调用
- 阻塞解除
- yield()礼让线程
进入阻塞状态的方式:
- sleep()
- join()
- wait()
- IO
进入终止状态的方式:
- 通过stop()直接停止方法
- 通过添加标识符 判断
- 正常执行结束
注意:一个线程一旦执行完毕,不能回复,重新new,也是新的线程
阻塞解除无法直接回复到运行状态,会回复到就绪状态,等待下一次被cup调度