day14_thread01_侯一鸣

本文介绍两个多线程应用实例:一是使用线程不停输出问候语并可通过键盘指令停止;二是模拟迅雷下载过程,采用三个线程下载100M资源,确保线程间的数据安全。

Tasks01: 多线程输出

问题

自己利用线程的第一种实现方式,实现如下功能(多线程引例):

a. 程序不停地在屏幕上输出一句问候的语句(比如“你好”) (时间间隔一定要大些比如3s(或大于3s),因 为 在控制台窗 口,输入和输出不能同时发生,我们只能在两次输出“你好”的间隙,从键盘输入数 据,才能 保证键盘输入被正确接收)

b.同时,当我通过键盘输入固定响应的时候,程序停止向屏幕输出问候的语句

代码

package day14.Task01;

import java.util.Scanner;

public class Task01 {
    static boolean flag = true;

    public static void main(String[] args) {
        SayHello thread1 = new SayHello();
        WaitToStop thread2 = new WaitToStop();

        thread1.start();
        thread2.start();
    }
}

class SayHello extends Thread {
    @Override
    public void run() {
        while (Task01.flag) {
            System.out.println("你好");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class WaitToStop extends Thread {
    @Override
    public void run() {
        Scanner scanner = new Scanner(System.in);
        while (true) {
            String s = scanner.nextLine();
            if ("gun".equals(s)) {
                Task01.flag = false;
                System.out.println("好滴,我滚");
                break;
            }
        }
    }
}

结果

image-20220113204914800

Task02:模拟迅雷下载

问题

用多线程代码来模拟,迅雷用3个线程下载100M资源的的过程。

每个线程每次,一次下载1兆(M)资源,直到下载完毕,即剩余的待下载资源大小为0 (用一个整数表示资 源大小,每次个线程每次下载多少兆(M), 剩余待下载资源就减少多少兆(M)。

模拟我们售票的代码实现,考虑多线程的数据安全问题)

代码

package day14.Tasks;

public class Tasks {
    public static void main(String[] args) {
        DownloadTask downloadTask = new DownloadTask();

        Thread thread1 = new Thread(downloadTask,"thread1");
        Thread thread2 = new Thread(downloadTask,"thread2");
        Thread thread3 = new Thread(downloadTask,"thread3");

        thread1.start();
        thread2.start();
        thread3.start();
    }
}

class DownloadTask extends Thread{
    int resources = 1;
    private Object lockObj = new Object();

    @Override
    public void run() {
        while(resources <= 100){
            try {
                DownloadTask.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            synchronized (lockObj){
                if (resources <= 100){
                    int surplusResources = 100 - resources;
                    System.out.println(Thread.currentThread().getName() + ": 下载了第" + this.resources + "M的资源,还剩" + surplusResources + "M的资源");
                    resources++;
                }
            }
        }
    }
}

结果

image-20220113212303596

image-20220113212324319

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值