多线程
多线程学习的目标:
1.创建与开启多线程
2.线程状态
3.线程安全
4.线程通信
一、继承Thread类
网络文件复制:
import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.net.URL; public class ThreadTest01 extends Thread{ public static void copy(String src,String dest){ try { FileUtils.copyURLToFile(new URL(src),new File(dest)); } catch (IOException e) { e.printStackTrace(); } } }
public class ThreadTest02 extends Thread{ private String url; private String dest; public ThreadTest02(String url, String dest) { this.url = url; this.dest = dest; } public void run(){ ThreadTest01.copy(url,dest); } public static void main(String[] args) { ThreadTest02 t1=new ThreadTest02("https://t7.baidu.com/it/u=2551908776,3460540251&fm=193&f=GIF","D:\\Temp\\dog.GIF"); t1.start(); } }
二、实现Runnable接口
招募士兵:
public class ThreadTest03 implements Runnable{ private int num=1; public static void main(String[] args) { ThreadTest03 tt=new ThreadTest03(); Thread t1=new Thread(tt,"刘备"); Thread t2=new Thread(tt,"曹操"); Thread t3=new Thread(tt,"孙权"); t1.start(); t2.start(); t3.start(); } @Override public void run() { int i=0; while(num<=100){ System.out.println(Thread.currentThread().getName()+"招募走了第"+num++ +"个兵卒"+ ++i); } } }
三、juc 下 Callable接口
龟兔赛跑:
import java.util.concurrent.*; public class ThreadTest04 implements Callable<String> { private String winner; public static void main(String[] args) throws ExecutionException, InterruptedException { ThreadTest04 tt=new ThreadTest04(); ExecutorService service= Executors.newFixedThreadPool(2); Future<String> f1=service.submit(tt); Future<String> f2=service.submit(tt); System.out.println(f1.get()); System.out.println(f2.get()); service.shutdown(); } @Override public String call() throws Exception { int step=1; while (winner==null){ if(step==100) winner=Thread.currentThread().getName(); if("兔子".equals(Thread.currentThread().getName())&&step%10==0){ Thread.sleep(100); } System.out.println(Thread.currentThread().getName()+"跑了第"+step++ +"步"); if("兔子".equals(Thread.currentThread().getName())) Thread.sleep(5); if("乌龟".equals(Thread.currentThread().getName())) Thread.sleep(10); } return winner; } }
四、线程的状态
新生状态 : new Thread(),new的时候就是一个线程进入新生状态
就绪状态 : start() 一个线程就会进入到就绪状态,进入就绪队列进行等待,可以等待cpu的调度
运行状态 : 当cpu调用调度到就绪队列中的某一个线程,这个线程开始进入运行状态
阻塞状态 : 线程无法正常执行,可以能会进入到阻塞状态
终止状态 : 线程执行完毕
1、如何进入到就绪状态:
1.start()
2.线程切换 : 被切换的线程恢复到就绪状态,等待下一次被调用
3.阻塞解除
4.yield() 礼让线程
2、进入阻塞状态的方式:
1.sleep()
2.join()
3.wait()
4.IO等
3、进入终止状态的方式:
1.stop() 终止方法-->不推荐使用->比较暴力手法
2.通过添加标识判断 --> 推荐
3.正常执行完毕
注意:
1.一个线程一旦执行完毕,不能回复,重新new,也是新的线程
2.阻塞解除无法直接恢复到运行状态,会恢复到就绪状态,等待下一次被cpu调度