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;
}
}
}
}
结果

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++;
}
}
}
}
}
结果


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

5312

被折叠的 条评论
为什么被折叠?



