3种线程创建
多线程
继承Thread类
package thread;
//创建线程方法一:继承Thread类,重写run()方法,调用start开启线程
//线程不一定立即执行,由CPU调度执行
public class Demo01 extends Thread {
@Override
public void run() {
for (int i = 0; i <1000 ; i++) {
System.out.println("多线程"+i);
}
}
public static void main(String[] args) {
Demo01 x= new Demo01();
x.start();
for (int i = 0; i < 1000; i++) {
System.out.println("主线程"+i);
}
}
}
package thread;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class Demo02 extends Thread {
private String url;
private String name;
public Demo02(String url, String name) {
this.url = url;
this.name = name;
}
@Override
public void run() {
WebDownloader webDownloader =new WebDownloader();
webDownloader.downloader(url,name);
System.out.println("下载了文件"+name);
}
public static void main(String[] args) {
String url = " https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fa0.att.hudong.com%2F30%2F29%2F01300000201438121627296084016.jpg&refer=http%3A%2F%2Fa0.att.hudong.com&app=2002&size=f9999 ,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1616868187&t=0e0819c4db2720f46e49318fe7db6cef";
Demo02 d1 = new Demo02(url,"1.jpg");
Demo02 d2 = new Demo02(url,"2.jpg");
Demo02 d3 = new Demo02(url,"3.jpg");
d1.start();
d2.start();
d3.start();
}
}
class WebDownloader {
public void downloader(String url, String name) {
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,downloader方法出现问题");
}
}
}
下载的结果顺序为随机的,并不是按顺序进行的
下载了文件1.jpg
下载了文件3.jpg
下载了文件2.jpg
实现Runnable接口(推荐使用)
package thread;
import com.sun.jdi.PathSearchingVirtualMachine;
import javax.swing.plaf.TableHeaderUI;
import java.lang.management.ThreadMXBean;
//创建线程方式2:实现runnable接口,重写run方法,执行线程需要丢入Runnable接口实现类。调用Start方法
public class Demo03 implements Runnable{
@Override
public void run() {
for (int i = 0; i <1000 ; i++) {
System.out.println("多线程" + i);
}
}
public static void main(String[] args) {
Demo03 demo03 = new Demo03();
Thread t1 = new Thread(demo03);
t1.start();
//或者new Thread(demo03).start();
for (int i = 0; i < 1000; i++) {
System.out.println("主线程"+i);
}
}
}
与方法一区别就是使用接口,启动时需要Thread对象。
避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
龟兔赛跑
package thread;
import org.apache.commons.io.output.WriterOutputStream;
import javax.sound.midi.Soundbank;
public class Race implements Runnable {
static String winner;
@Override
public void run() {
for (int i = 0; i <= 1000; i++) {
boolean flag=win(i);
if (flag){
System.out.println("winner is "+ winner);
break;
}
System.out.println(Thread.currentThread().getName()+"跑了"+i+"步数");
}
}
private boolean win(int i) {
if( winner!=null){return true;}
if(i>999){
winner = Thread.currentThread().getName();
return true;
}
return false;
}
public static void main(String[] args) {
Race r= new Race();
new Thread(r,"兔子").start();
new Thread(r,"乌龟").start();
}
}
实现Callable接口
package thread;
import java.util.concurrent.*;
public class Demo04 implements Callable<Boolean>{
private String url;
private String name;
public Demo04(String url, String name) {
this.url = url;
this.name = name;
}
@Override
public Boolean call() throws Exception {
WebDownloader webDownloader =new WebDownloader();
webDownloader.downloader(url,name);
System.out.println("下载了文件"+name);
return true;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
String url = " https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fa0.att.hudong.com%2F30%2F29%2F01300000201438121627296084016.jpg&refer=http%3A%2F%2Fa0.att.hudong.com&app=2002&size=f9999 ,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1616868187&t=0e0819c4db2720f46e49318fe7db6cef";
Demo04 d1 = new Demo04(url,"1.jpg");
Demo04 d2 = new Demo04(url,"2.jpg");
Demo04 d3 = new Demo04(url,"3.jpg");
//创建执行服务:
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> r1 =ser.submit(d1);
Future<Boolean> r2 =ser.submit(d2);
Future<Boolean> r3 =ser.submit(d3);
//获取结果
boolean rs1 =r1.get ();
boolean rs2 =r2.get();
boolean rs3 =r3.get();
//关闭服务
ser.shutdownNow();
}
}
好处:
-
可定义返回值
-
可以抛出异常
浙公网安备 33010602011771号