开启多线程的三种方式
继承Thread类
1.继承Thread类
2.重写run()方法
3.调用star方法
public class TestThread1 extends Thread{
/*
1.继承Thread类
2.重写run方法
3.调用start方法开启线程
*/
@Override
public void run() {
for(int i=0;i<200;i++){
System.out.println("bbbbbbbb");
}
}
public static void main(String[] args) {
TestThread1 thread=new TestThread1();
thread.start();
for (int i=0;i<200;i++){
System.out.println("aaaaaaaaaaa");
}
}
}
实现Runnable接口
1.实现Runnable接口,重写run方法
2.创建当前类的对象
3.创建Thread类对象,使用Runnable接口构造方法
4.调用start方法
public class TestThread3 implements Runnable{
@Override
/*
1.实现Runnable接口,重写run方法
2.将Runnable接口丢入Thread
*/
public void run() {
for(int i=0;i<200;i++){
System.out.println("bbbbbbbb");
}
}
public static void main(String[] args) {
TestThread3 thread3 = new TestThread3();
new Thread(thread3).start();
for (int i=0;i<200;i++){
System.out.println("aaaaaaaaaaa");
}
}
}
好处:可以多个线程公用一个对象
实列:模拟抢票软件
public class TestThread4 implements Runnable{
private int ticketname=10;
@Override
public void run() {
while(true){
if(ticketname<=0) break;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"抢到了第"+ticketname--+"张票");
}
}
public static void main(String[] args) {
TestThread4 thread4 = new TestThread4();
new Thread(thread4,"张三").start();
new Thread(thread4,"李四").start();
new Thread(thread4,"王五").start();
}
}
实现Callable接口
1.重写call方法
2.打开服务和线程池
3.将Callable接口扔进线程池
4.关闭服务
实列:多线程同时下载网络图片
public class TestCallable implements Callable<Boolean> {
private String name;
private String url;
public TestCallable(String url, String name) {
this.name = name;
this.url = url;
}
@Override
public Boolean call() throws Exception {
Webloader load =new Webloader();
load.WebDownloader(name,url);
System.out.println(Thread.currentThread().getName()+"下载完成了");
return true;
}
public static void main(String[] args) {
TestCallable t1= new TestCallable("https://img0.baidu.com/it/u=53211142,3579082837&fm=26&fmt=auto","白熊.jpg");
TestCallable t2= new TestCallable("https://img2.baidu.com/it/u=1868254201,2187725343&fm=26&fmt=auto","棕熊.jpg");
TestCallable t3= new TestCallable("https://img1.baidu.com/it/u=1615031516,635347996&fm=26&fmt=auto","胖达.jpg");
ExecutorService ser = Executors.newFixedThreadPool(3);
Future<Boolean> r1 = ser.submit(t1);
Future<Boolean> r2 = ser.submit(t2);
Future<Boolean> r3 = ser.submit(t3);
ser.shutdown();
}
}
class Webloader{
public void WebDownloader(String name,String url){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
}
}
}
好处:有返回值