Thread多线程(一)

三高:高可用:数据不能出错

      高性能:用户体验要好

      高并发:竞争执行

 

创建线程

三种方式:继承Thread类、实现Runnable接口、实现Callable接口

注意:前两种方式用得比较多,一般推荐使用第二种方式

用户线程:程序必须执行完才能停止

守护线程:

第一种方式:继承Thread类

start方法使用native修饰,调用本地方法,jni技术(了解即可)

示例:继承Thread类,创建简单的多线程

public class Demo extends Thread {
    
    @Override
    public void run() {
        for(int i=0;i<40;i++) {
            System.out.println("一边工作");
        }
    }
    
    public static void main(String[] args) {
        Demo d = new Demo() ;
        d.start();
        for(int i=0;i<40;i++) {
            System.out.println("一边学习");
        }
    }
    
    
}
View Code

 

示例:多线程下载图片(使用Commons_IO)

public class Downloader extends Thread {
    
    private String url ;
    private String fileName ;
    
    public Downloader(String url,String fileName) {
        this.url = url ;
        this.fileName = fileName ;
    }
    
    public void urlDownload(String url,String fileName) {//根据url下载资源,并生成指定文件
        try {
            FileUtils.copyURLToFile(new URL(url), new File(fileName));
        } catch (MalformedURLException e) {
            e.printStackTrace();
            System.out.println("不合法的url");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("下载失败");
        }
    }
    
    @Override
    public void run() {
        urlDownload(url, fileName);
    }
    
    public static void main(String[] args) {
        Downloader td1 =new Downloader("https://pic2.zhimg.com/v2-7d01cab20858648cbf62333a7988e6d0_qhd.jpg","manva.jpg");
        Downloader td2 =new Downloader("http://p1.pstatp.com/large/403c00037462ae2eee13","spl.jpg");
        Downloader td3 =new Downloader("http://5b0988e595225.cdn.sohucs.com/images/20170830/d8b57e0dce0d4fa29bd5ef014be663d5.jpeg","success.jpg");
        td1.start();
        td2.start();
        td3.start();
    }
}
View Code

 

 

第二种方式:实现Runnable接口

示例:继承Runnable接口,创建简单的多线程

public class Demo2 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 30; i++) {
            System.out.println("一边学习");
        }
    }

    public static void main(String[] args) {
        // 第二种方式
        new Thread(new Demo2()).start();

        for (int i = 0; i < 30; i++) {
            System.out.println("一边工作");
        }
    }

    private static void demo1() {
        // 第一种方式
        Demo2 r = new Demo2();
        Thread t = new Thread(r);
        t.start();

        for (int i = 0; i < 30; i++) {
            System.out.println("一边工作");
        }
    }
}
View Code

 

 

示例:抢票(有线程安全问题)

public class Ticket implements Runnable{
    private int ticketNum ;
    public Ticket(int ticketNum) {
        this.ticketNum = ticketNum ;
    }
    
    @Override
    public void run() {//方法没有使用同步,有线程安全问题
        while(true) {//票数少于0,票已经卖完
            if(ticketNum<0) {
                break ;
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"-->"+ticketNum--);
        }
    }
    
    public static void main(String[] args) {//多个线程操作一个资源,有线程安全问题
        Ticket t = new Ticket(100) ;
        System.out.println(Thread.currentThread().getName());
        new Thread(t,"乘客1").start();
        new Thread(t,"乘客2").start();
        new Thread(t,"乘客3").start();
    }
}
View Code

 

 

 

 

 

 

 

zwy

posted @ 2019-03-06 07:40  zwyk  阅读(75)  评论(0)    收藏  举报