都忘了这茬子事了,哈哈。
话不多说直接进入正题,先看实验任务:
1. 阅读下列程序,写出运行结果,然后用Runnable接口编写程序来实现同样功能。 class SimpleThread extends Thread{ public SimpleThread(String str) { super(str); } public void run(){ for(int i=0;i<10;i++){ System.out.println(i+" "+getName()); try { sleep((int)Math.random()*1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("DONE!"+getName()); } } public class TwoThreadsTest { public static void main(String[] args) { new SimpleThread("First").start(); new SimpleThread("Second").start(); } } 2. 创建两个线程,一个线程打印“中国”,另一个线程打印“加油”,输出如下类似效果: 中国加油加油中国加油中国中国加油加油中国…。 3. 假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒售出一张票。请模拟并打印出售票过程。注意使用synchronized确保同一张票只能卖出一次。输出格式如下: 第4售票点卖出第100张票 第2售票点卖出第101张票…… 4. 假设某家银行每接受一次顾客的汇款,便可计算出当前汇款总额。若现有两个顾客,每人分3次、每次100元将钱汇入。试模拟该银行作业,输出格式如下: 顾客甲第1次存入100元,汇款总额100 顾客乙第1次存入100元,汇款总额200 顾客乙第2次存入100元,汇款总额300 …… |
代码块:
由于线程执行的情况不同,程序运行结果不唯一
1.先看给出代码的运行结果
再看实现Runnable接口的代码:
public class Test2 {
public static void main(String[] args) {
new Thread(new SimpleThread2("First")).start();
new Thread(new SimpleThread2("Second")).start();
}
}
class SimpleThread2 implements Runnable{
private String name;
public SimpleThread2(String name) {
this.name = name;
}
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println(i+" "+name);
try {
Thread.sleep((int)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("DONE!"+name);
}
}
关于继承 Thread 与实现 Runnable 接口还是有区别的,想了解的可以去搜索一下哈。
2.
public class Test3 {
public static void main(String[] args) {
PrintThread thread1=new PrintThread("中国");
PrintThread thread2=new PrintThread("加油");
thread1.start();
thread2.start();
}
}
class PrintThread extends Thread{
public PrintThread(String name) {
super(name);
}
public void run(){
for(int i=0;i<10;i++){
System.out.print(getName());
try {
Thread.sleep((int) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread.yield(); // 释放CPU资源,让给其他线程执行
}
}
}
3.
public class Test4 {
public static void main(String[] args) {
for(int i=1;i<=10;i++){
new Thread(new SaleTicketThread(i,"售票点")).start();
}
}
}
class SaleTicketThread implements Runnable{
private int id;
private String name;
private static int ticket=1;
static Object obj=new Object();//锁对象 必须唯一
public SaleTicketThread(int id,String name) {
this.id=id;
this.name = name;
}
@Override
public void run() {
while (true) {
synchronized (obj) {
if (ticket<=1000) {
try {
Thread.sleep(100);
System.out.println("第"+id+name+"卖出第"+ticket+"张票");
ticket++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
break;
}
}
}
}
}
4.
public class Test5 {
public static void main(String[] args) {
new Thread(new CountThread("顾客甲")).start();
new Thread(new CountThread("顾客乙")).start();
}
}
class CountThread implements Runnable {
private String name;
private static int count = 0;
static Object obj=new Object();
public CountThread(String name) {
this.name = name;
}
@Override
public void run() {
for(int i=1;i<=3;i++){
synchronized (obj) {
count+=100;
try {
System.out.println( name + "第" + i + "次存入100元,汇款总额"+count);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
有问题的欢迎评论区留言
再次声明 由于线程执行的情况不同,程序运行结果不唯一
还有一周考试,王某人也在此也祝愿各位好好复习别挂科
我不知道你们是不是这个状态,哈哈哈哈哈哈哈哈~