1. 作业一 两个线程A,B,A不停的打印100以内的随机数,B接收一个固定的键盘输入并停止A的输出。
所用知识点:
继承Thread类
Math.random()方法返回随机数
接受键盘输入Scanner类
Scanner scanner = new Scanner(system.in);
在B的內部声明A类,用以设置使A停止输出的标记
B的构造函数接受一个A类对象
主函数里创建B对象时要传a对象进去
public class Homework3 {
public static void main(String[] args) {
A a = new A();
B b = new B(a);
//把a传给b
a.start();
b.start();
}
}
//
class A extends Thread{
public void setLoop(boolean loop) {
this.loop = loop;
}
private boolean loop = true;
@Override
public void run() {
while(loop) {
System.out.println((int)(Math.random() * 100 + 1));
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//第二个线程,从键盘读取q
class B extends Thread{
private A a;
private Scanner scanner = new Scanner(System.in);
public B(A a) {
this.a = a;
}
@Override
public void run() {
while(true) {
//接受用户输入
System.out.println("please inter:");
char c = scanner.next().toUpperCase().charAt(0);
if(c == 'Q') {
a.setLoop(false);
System.out.println("thread B quited.");
break;
}
}
}
}
2. 作业2 两个线程用户同时从同一账户取钱
知识点:线程同步,互斥锁
synchronized (this) {
}
//在此对象上加锁,代码块内容为互斥操作的内容
this对象锁为非公平锁,即同一对象可以不停得获取此锁
public class Homework5 {
public static void main(String[] args) {
T t = new T();
Thread thread1 = new Thread(t);
thread1.setName("t1");
Thread thread2 = new Thread(t);
thread2.setName("t2");
thread1.start();
thread2.start();
}
}
class T implements Runnable{
@Override
public void run() {
while(true) {
//判断余额是否足够
//线程同步
synchronized (this) {
if(money < 1000) {
System.out.println("not enough balance");
break;
}
money -= 1000;
System.out.println(Thread.currentThread().getName() + "get 1000 and remains:" + money);
}
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private int money = 10000;
}
该博客讨论了两个线程协同工作的场景。作业一是如何使用Java实现一个线程A不断打印100以内的随机数,而线程B通过键盘输入'q'来停止A的输出。线程A通过继承Thread类并设置一个布尔标志来控制其运行状态。作业二涉及线程同步,创建了两个线程同时从同一账户取钱,通过`synchronized`关键字确保取款操作的互斥,防止数据不一致。当余额不足时,线程将停止取款。
10万+

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



