码迷,mamicode.com
首页 > 编程语言 > 详细

多线程:多线程的应用(网图下载、模拟售票、龟兔赛跑)

时间:2020-05-25 19:57:41      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:网络   模拟   logs   inter   tick   网络图片   2-2   nload   创建线程   

1、网图下载(继承Thread类)

(1)导包

技术图片

 

(2)创建WebDownloader 类,书写下载图片的方法:

public class WebDownloader {
    public void downloader(String url,String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(3)创建TestThread 类,继承Thread类,用于实现多线程:

public class TestThread extends Thread{
    private String url;//网络图片地址
    private String name;//保存的文件名
    public TestThread(String url, String name) {
        this.url = url;
        this.name = name;
    }
    public void run(){
        WebDownloader webDownloader=new WebDownloader();
        webDownloader.downloader(url,name);
        System.out.println("下载了:"+name);
    }

    public static void main(String[] args) {
        TestThread testThread1=new TestThread("https://img2018.cnblogs.com/blog/1392562/201908/1392562-20190817173332328-1651495806.png","1.pnj");
        TestThread testThread2=new TestThread("https://img2020.cnblogs.com/blog/1392562/202005/1392562-20200516214429116-874432537.png","2.png");
        TestThread testThread3=new TestThread("https://img2018.cnblogs.com/blog/1392562/201908/1392562-20190817173332328-1651495806.png","3.png");
        testThread1.start();
        testThread2.start();
        testThread3.start();
    }
}

继承Thread类,书写run方法,在该方法内部调用图片下载的方法,最后,创建线程对象,并利用对象调用start方法开启三个线程

(4)测试:

下载了:2.png
下载了:1.pnj
下载了:3.png

技术图片

 

2、模拟售票

(1)代码:

public class TestThread implements Runnable{
    private int ticketsNums=10;
    @Override
    public void run() {
        while(true){
            if(ticketsNums<=0){
                break;
            }
            try {
                Thread.sleep(200);//延时200ms
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread()+"拿到了"+ticketsNums--+"张票");
        }
    }

    public static void main(String[] args) {
        TestThread testThread=new TestThread();
        new Thread(testThread,"zhai").start();
        new Thread(testThread,"zhang").start();
        new Thread(testThread,"liu").start();
    }
}

调用sleep方法的目的是避免第一个线程长时间的占用,给后面两个线程机会

(2)测试:

Thread[liu,5,main]拿到了10张票
Thread[zhang,5,main]拿到了9张票
Thread[zhai,5,main]拿到了8张票
Thread[liu,5,main]拿到了7张票
Thread[zhang,5,main]拿到了6张票
Thread[zhai,5,main]拿到了5张票
Thread[liu,5,main]拿到了4张票
Thread[zhang,5,main]拿到了3张票
Thread[zhai,5,main]拿到了2张票
Thread[zhang,5,main]拿到了1张票
Thread[liu,5,main]拿到了1张票
Thread[zhai,5,main]拿到了0张票

可以看到有的票出现了两次,这是因为在多个线程共享同一个数据的时候存在线程安全的问题,当对存在安全隐患的数据加锁后,会导致程序的性能降低,所以,如果是多个线程操作同一个数据,一定要选择线程安全的方法,如果不是,可以选择线程不安全的方式来处理问题(多线程(线程间的数据共享、线程安全、线程通信)

 

3、龟兔赛跑

(1)代码:

public class Race implements Runnable {
    //胜利者
    private static String winner;
    @Override
    public void run() {
        for(int i=0;i<=100;i++){
            //模拟兔子休息
            if(Thread.currentThread().getName().equals("兔子")&&i%20==0){
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //判断比赛是否结束
            boolean flag=gameOver(i);
            //如果比赛结束了,就停止程序
            if(flag){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"跑了"+i+"步");
        }
    }
    //判断是否完成比赛
    private boolean gameOver(int steps){
        if(winner!=null){
            return true;
        }{
            if(steps>=100){
                winner=Thread.currentThread().getName();
                System.out.println("winner is"+winner);
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Race race=new Race();
        new Thread(race,"兔子").start();
        new Thread(race,"乌龟").start();
    }
}

(2)测试:

乌龟跑了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步
乌龟跑了42步
乌龟跑了43步
乌龟跑了44步
乌龟跑了45步
乌龟跑了46步
乌龟跑了47步
乌龟跑了48步
乌龟跑了49步
乌龟跑了50步
乌龟跑了51步
乌龟跑了52步
乌龟跑了53步
乌龟跑了54步
乌龟跑了55步
乌龟跑了56步
乌龟跑了57步
乌龟跑了58步
乌龟跑了59步
乌龟跑了60步
兔子跑了0步
兔子跑了1步
兔子跑了2步
兔子跑了3步
兔子跑了4步
兔子跑了5步
兔子跑了6步
兔子跑了7步
兔子跑了8步
兔子跑了9步
兔子跑了10步
兔子跑了11步
兔子跑了12步
兔子跑了13步
兔子跑了14步
兔子跑了15步
兔子跑了16步
兔子跑了17步
兔子跑了18步
兔子跑了19步
乌龟跑了61步
乌龟跑了62步
乌龟跑了63步
乌龟跑了64步
乌龟跑了65步
乌龟跑了66步
乌龟跑了67步
乌龟跑了68步
乌龟跑了69步
兔子跑了20步
兔子跑了21步
兔子跑了22步
兔子跑了23步
兔子跑了24步
兔子跑了25步
兔子跑了26步
兔子跑了27步
兔子跑了28步
兔子跑了29步
兔子跑了30步
兔子跑了31步
兔子跑了32步
兔子跑了33步
兔子跑了34步
兔子跑了35步
兔子跑了36步
兔子跑了37步
兔子跑了38步
兔子跑了39步
乌龟跑了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步
乌龟跑了99步
winner is乌龟

此例子中,兔子线程和乌龟线程没有共享数据,也就是说他们的步数是相互独立的。当执行兔子线程的时候调用sleep方法,给乌龟线程更多的时间。率先执行到100步的时候程序停止,获取线程的名字。

 

多线程:多线程的应用(网图下载、模拟售票、龟兔赛跑)

标签:网络   模拟   logs   inter   tick   网络图片   2-2   nload   创建线程   

原文地址:https://www.cnblogs.com/zhai1997/p/12955959.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!