前言
多线程使用学习
一、使用多线程方法
①:继承Thread类【实际上也是实现了Runnable接口】
启动线程:子类对象.start() 不建议使用:避免OOP单继承局限性
/**
* 创建线程方法1
*
* 继承thread类
* 重写run方法
* 调用start开启线程
*
*
* 总结:线程开启不一定立即执行,由CPU调度执行
*
*/
public class TestThread1 extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("run方法-----------" + i);
}
}
/**
* 穿插执行
* @param args
*/
public static void main(String[] args) {
TestThread1 thread1 = new TestThread1();
thread1.start();
for (int i = 0; i < 2000; i++) {
System.out.println("main方法-----------" + i);
}
}
}
②:实现Runnable接口
启动线程:传入目标对象 + Thread对象.start() 建议使用
/**
* 创建线程方法2
*
* 实现Runnable接口
* 实现run方法
* 丢入thread接口实现类 调用start开启线程
*
*
* 总结:线程开启不一定立即执行,由CPU调度执行
*
*/
public class TestThread3 implements Runnable{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("run方法-----------" + i);
}
}
public static void main(String[] args) {
TestThread3 t3 = new TestThread3();
new Thread(t3).start();
for (int i = 0; i < 2000; i++) {
System.out.println("main方法-----------" + i);
}
}
}
③:实现Callable接口 (有返回值)
/**
* @Auther RenHuiMa
* @Date 2021-07-16 10:14
**/
public class TestThread6 implements Callable<Boolean> {
@Override
public Boolean call() throws Exception {
down(url,name);
System.out.println("Callable下载了文件名为:" + name);
return true;
}
private String url;
private String name;
public TestThread6(String url,String name){
this.url = url;
this.name = name;
}
public void down(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常!");
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
TestThread6 t1 = new TestThread6("https://bpic.588ku.com//back_origin_min_pic/19/10/22/ce4f49e80c3e4a3e2fce838cb9f28dc9.jpg!/fw/750/quality/99/unsharp/true/compress/true","1.png");
TestThread6 t2 = new TestThread6("https://bpic.588ku.com//back_origin_min_pic/19/10/22/fcd792510564568053ecd83009319999.jpg!/fw/750/quality/99/unsharp/true/compress/true","2.png");
TestThread6 t3 = new TestThread6("https://bpic.588ku.com//back_origin_min_pic/19/10/22/fcd792510564568053ecd83009319999.jpg!/fw/750/quality/99/unsharp/true/compress/true","3.png");
// 创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);
// 提交执行
Future<Boolean> r1 = ser.submit(t1);
Future<Boolean> r2 = ser.submit(t2);
Future<Boolean> r3 = ser.submit(t3);
// 获取结果
boolean rs1 = r1.get();
boolean rs2 = r2.get();
boolean rs3 = r3.get();
System.out.println(rs1);
System.out.println(rs2);
System.out.println(rs3);
// 关闭服务
ser.shutdownNow();
}
}
二、使用例子(模拟龟兔赛跑)
1.代码
代码如下(示例):
/**
* @Auther RenHuiMa
* @Date 2021-01-23 17:44
**/
public class RaceThread implements Runnable{
/* 定义胜利者 */
private static String winner;
public void run() {
for (int i = 0; i <= 100; i++) {
/* 模拟兔子睡觉 */
if(Thread.currentThread().getName().equals("兔子") && i%10 == 0){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/* 比赛结束 */
if(gameOver(i)){
break;
}
System.out.println(Thread.currentThread().getName() + "-->跑了" + i + "步");
}
}
private boolean gameOver(int step) {
if(winner != null){
return true;
}else{
if(step >= 100){
winner = Thread.currentThread().getName();
System.out.println("winner is" + winner);
return true;
}
}
return false;
}
public static void main(String[] args) {
RaceThread race = new RaceThread();
new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
}
}
结果:
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\WorkTool\IntelliJ IDEA 2018.3.4\lib\idea_rt.jar=55099:D:\WorkTool\IntelliJ IDEA 2018.3.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;H:\IDEAworkspace\javaTestDemo\target\classes" RaceThread
乌龟-->跑了0步
乌龟-->跑了1步
乌龟-->跑了2步
乌龟-->跑了3步
乌龟-->跑了4步
乌龟-->跑了5步
乌龟-->跑了6步
乌龟-->跑了7步
乌龟-->跑了8步
乌龟-->跑了9步
乌龟-->跑了10步
乌龟-->跑了11步
乌龟-->跑了12步
乌龟-->跑了13步
乌龟-->跑了14步
乌龟-->跑了15步
乌龟-->跑了16步
乌龟-->跑了17步
乌龟-->跑了18步
乌龟-->跑了19步
乌龟-->跑了20步
乌龟-->跑了21步
乌龟-->跑了22步
乌龟-->跑了23步
乌龟-->跑了24步
乌龟-->跑了25步
乌龟-->跑了26步
乌龟-->跑了27步
乌龟-->跑了28步
乌龟-->跑了29步
乌龟-->跑了30步
乌龟-->跑了31步
乌龟-->跑了32步
乌龟-->跑了33步
乌龟-->跑了34步
乌龟-->跑了35步
乌龟-->跑了36步
乌龟-->跑了37步
乌龟-->跑了38步
乌龟-->跑了39步
乌龟-->跑了40步
乌龟-->跑了41步
兔子-->跑了0步
乌龟-->跑了42步
兔子-->跑了1步
乌龟-->跑了43步
乌龟-->跑了44步
乌龟-->跑了45步
兔子-->跑了2步
乌龟-->跑了46步
乌龟-->跑了47步
乌龟-->跑了48步
乌龟-->跑了49步
兔子-->跑了3步
兔子-->跑了4步
兔子-->跑了5步
兔子-->跑了6步
兔子-->跑了7步
乌龟-->跑了50步
乌龟-->跑了51步
乌龟-->跑了52步
乌龟-->跑了53步
乌龟-->跑了54步
乌龟-->跑了55步
乌龟-->跑了56步
乌龟-->跑了57步
兔子-->跑了8步
兔子-->跑了9步
乌龟-->跑了58步
乌龟-->跑了59步
乌龟-->跑了60步
乌龟-->跑了61步
乌龟-->跑了62步
乌龟-->跑了63步
乌龟-->跑了64步
乌龟-->跑了65步
乌龟-->跑了66步
乌龟-->跑了67步
乌龟-->跑了68步
乌龟-->跑了69步
乌龟-->跑了70步
乌龟-->跑了71步
乌龟-->跑了72步
乌龟-->跑了73步
乌龟-->跑了74步
乌龟-->跑了75步
乌龟-->跑了76步
乌龟-->跑了77步
乌龟-->跑了78步
乌龟-->跑了79步
乌龟-->跑了80步
乌龟-->跑了81步
乌龟-->跑了82步
乌龟-->跑了83步
乌龟-->跑了84步
乌龟-->跑了85步
乌龟-->跑了86步
乌龟-->跑了87步
乌龟-->跑了88步
乌龟-->跑了89步
乌龟-->跑了90步
乌龟-->跑了91步
乌龟-->跑了92步
乌龟-->跑了93步
乌龟-->跑了94步
乌龟-->跑了95步
乌龟-->跑了96步
乌龟-->跑了97步
乌龟-->跑了98步
兔子-->跑了10步
兔子-->跑了11步
兔子-->跑了12步
兔子-->跑了13步
兔子-->跑了14步
兔子-->跑了15步
兔子-->跑了16步
兔子-->跑了17步
兔子-->跑了18步
兔子-->跑了19步
乌龟-->跑了99步
winner is乌龟
Process finished with exit code 0