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();
    }
}

好处:

  • 可定义返回值

  • 可以抛出异常

posted @ 2021-03-05 22:14  坚持出成绩  阅读(112)  评论(0)    收藏  举报