一、实验目的
1. 掌握线程类的定义和使用方法;
2. 能够解决线程调度、线程同步等问题;
3. 能够选择使用合适的线程类和接口设计多线程程序完成相关操作,解决特定问题。
二、课程目标
支撑课程目标(4):了解Java开发主流平台、工具的特点、使用方法和局限性,能够借助IDE等工具完成程序的调试、测试,敢于质疑,具有实践验证、评价优化的能力,体现软件质量意识。
三、实验任务
1. 阅读下列程序,写出运行结果,然后用Runnable接口编写程序来实现同样功能。
2. 创建两个线程,一个线程打印“中国”,另一个线程打印“加油”,输出如下类似效果:
中国加油加油中国加油中国中国加油加油中国…。
3. 假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒售出一张票。请模拟并打印出售票过程。注意使用synchronized确保同一张票只能卖出一次。输出格式如下:
第4售票点卖出第100张票 第2售票点卖出第101张票……
4. 假设某家银行每接受一次顾客的汇款,便可计算出当前汇款总额。若现有两个顾客,每人分3次、每次100元将钱汇入。试模拟该银行作业,输出格式如下:
顾客甲第1次存入100元,汇款总额100
顾客乙第1次存入100元,汇款总额200
顾客乙第2次存入100元,汇款总额300
任务1 代码如下:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.Thread.sleep;
public class TwoThreadsTest {
public static void main(String[] args) {
SimpleThread m=new SimpleThread();
Thread t1=new Thread(m);
Thread t2=new Thread(m);
t1.setName("First");
t2.setName("Second");
t1.start();
t2.start();
}
}
class SimpleThread implements Runnable{
public void run() {
for(int i=0;i<10;i++)
{
System.out.println(i+" "+Thread.currentThread().getName());
try{
Thread.sleep((int) (Math.random()*1000));
} catch (InterruptedException e) {
}
}
System.out.println("DONE!"+Thread.currentThread().getName());
}
}
任务2代码如下:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.Thread.sleep;
public class TwoThreadsTest {
public static void main(String[] args) {
new SimpleThread("中国").start();
new SimpleThread("加油").start();
}
}
class SimpleThread extends Thread {
public SimpleThread(String name) {
super(name);
}
public static int ticket =0;
public static Object obj=new Object();
public void run() {
for(int i=1;i<=10;i++)
{
System.out.print(getName());
try{
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
任务3代码如下:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.Thread.sleep;
public class TwoThreadsTest {
public static void main(String[] args) {
new SimpleThread("1").start();
new SimpleThread("2").start();
new SimpleThread("3").start();
new SimpleThread("4").start();
new SimpleThread("5").start();
new SimpleThread("6").start();
new SimpleThread("7").start();
new SimpleThread("8").start();
new SimpleThread("9").start();
new SimpleThread("10").start();
}
}
class SimpleThread extends Thread {
public SimpleThread(String name) {
super(name);
}
public static int ticket =0;
public static Object obj=new Object();
public void run() {
while(true){
synchronized(obj){
if(ticket<1000){
try{
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticket++;
System.out.print("第"+getName()+"售票点卖出第"+ticket+"张票"+" ");
}
else break;
}
}
}
}
任务4代码如下:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.Thread.sleep;
public class TwoThreadsTest {
public static void main(String[] args) {
account m=new account("顾客甲");
account n=new account("顾客乙");
m.start();
n.start();
}
}
class account extends Thread {
public account(String name) {
super(name);
}
static Lock lock = new ReentrantLock();
public static int money = 0;
public void run() {
for (int i = 1; i <= 3; i++) {
try {
sleep(100);
} catch (InterruptedException e) {
}
synchronized (Thread.class){
money += 100;
System.out.println("顾客" + getName() + "第" + i + "次存入100元,汇款总额" + money);
}
}
}