头歌《习题答案》

1.第一关

(1)共享;小

(2)继承Thread类;实现Runnable接口

2.第二关

(1)新建状态

(2)就绪状态

(3)运行状态

(4)阻塞状态

(5)死亡状态

3.第三关

package step1;

class Thread1 extends Thread {
    @Override
    public void run() {//循环输出10次北京,每次显示后需休眠一段时间(1000毫秒以内)
        /******** Begin ********/
        for(int i = 0; i < 10; i++) {
System.out.println("北京");
try {
sleep(1000);
}
catch(Exception e) {}
}


        /********  End  ********/
    }
}
class Thread2 implements Runnable {
    @Override
    public void run() {//循环输出10次西安,每次显示后需休眠一段时间(1000毫秒以内)
        /******** Begin ********/
        for(int i = 0; i < 10; i++) {
System.out.println("西安");
try {
Thread.sleep(1000);
}
catch(Exception e) {}
}


        /********  End  ********/
    }
}
public class Exe8_3 {
    public static void main(String[] args) {
        //创建 Thread1 对象 和 Thread2 对象并启动两个线程
        /******** Begin ********/
        Thread1 thread1 = new Thread1();
Thread2 thread2 = new Thread2();
thread1.start();
new Thread(thread2).start();


        /********  End  ********/
    }
}

4.第四关

package step2;
// 协助三个线程之间通信的类
class SyncObject {
}
//线程A和B的类
class WaitThread extends Thread {
final SyncObject so;
String name;
WaitThread(SyncObject so, String name) {
this.so = so;
this.name = name;
}
@Override
public void run() {
synchronized(so) { //获得锁旗标
/******** Begin ********/
System.out.println(name + " start");
try {
so.wait(); 
}
catch(Exception e) {
e.printStackTrace();
}
so.notifyAll(); //唤醒其他线程
System.out.println(name + " end");
/******** End ********/
}
}
}
//线程C的类
class NotifyThread extends Thread {
String name;
final SyncObject so;
NotifyThread(SyncObject so, String name) {
this.so = so;
this.name = name;
}
@Override
public void run() {
synchronized(so) {
/******** Begin ********/
try {
sleep(5000); //sleep后唤醒其他线程,然后自己wait
so.notifyAll();
so.wait();
}
catch(Exception e) {
e.printStackTrace();
}
System.out.println(name + " end");
/******** End ********/
}
}
}
//测试类,执行A,B,C三个线程
public class Exe8_4 {
public static void main(String[] args) {
SyncObject so = new SyncObject();
WaitThread thread1 = new WaitThread(so, "A");
WaitThread thread2 = new WaitThread(so, "B");
NotifyThread thread3 = new NotifyThread(so,"C");
/******** Begin ********/
thread1.start();
thread2.start();
thread3.start();
/******** End ********/
}
}

5.第五关

package step3;

//数据单元类,在其中实现写入和读出的同步
class DataUnit {
int number;
String name;
boolean available;
DataUnit() {
this.number = 0;
this.name = "";
this.available = false;
}
public synchronized void write(int number, String name) {
/******** Begin ********/
if(available) { //如果有内容,则不能写,开始wait
try {
wait();
}
catch(Exception e) {
e.printStackTrace();
} 
}
/******** End ********/
System.out.println("Write " + number + "\t" + name);
this.number = number;
this.name = name;
available = true;
notify();
}
public synchronized void read() {
/******** Begin ********/
if(!available) { //如果没有内容,则不能读,开始wait
try {
wait();
}
catch(Exception e) {
e.printStackTrace();
}
}
/******** End ********/
System.out.println("Read " + number + "\t" + name);
available = false;
notify();
}
}
class DataWriter extends Thread{
DataUnit du;
DataWriter(DataUnit du) {
this.du = du;
}
@Override
public void run() {
/******** Begin ********/
for(int i = 0; i < 10; i++) { //写入10次
du.write(i, "Name" + i);
}
/******** End ********/
}
}
class DataReader extends Thread {
DataUnit du;
DataReader(DataUnit du) {
this.du = du;
}
@Override
public void run() {
/******** Begin ********/
for(int i = 0; i < 10; i++) { //读出10次
du.read();
}
/******** End ********/
}
}
public class Exe8_5 {
public static void main(String[] args) {
/******** Begin ********/
DataUnit du = new DataUnit();
DataWriter dw = new DataWriter(du);
DataReader dr = new DataReader(du);
dr.start();
dw.start();
/******** End ********/
}
}

6.第六关

package step4;
class CountThread extends Thread {
int num;
String name;
public CountThread(int num, String name) {
this.num = num;
this.name = name;
}
@Override
public void run() { // 在run方法中打印每次数数 
/******** Begin ********/
for(int i = 0; i < num; i++) {
System.out.println(name + ":" + i);
}
/******** End ********/
System.out.println(name + " counts finish");
}
}
public class Exe8_6 {
public static void main(String[] args) {
CountThread ct1 = new CountThread(50000, "thread 1");
CountThread ct2 = new CountThread(50000, "thread 2");
/******** Begin ********/
ct1.setPriority(2); //设置第一个线程优先级为2
ct2.setPriority(8); //设置第二个线程优先级为8
ct1.start(); //启动线程
ct2.start();
/******** End ********/
}
}

7.第七关

package step5;
import java.util.*;
//两个线程共享
class SyncObject {
public int flag;//标记位,用于控制线程2是否sleep以及是否打印
}
class Thread1 extends Thread{
SyncObject so;
Thread1 (SyncObject so) {
this.so = so;
}
@Override
public void run() {
//线程1打印2500次,此时线程2不sleep
/******** Begin ********/
Calendar start = Calendar.getInstance();
for(int i = 0; i < 1000; i++) {
System.out.println("thread1:" + i);
}
Calendar end = Calendar.getInstance();
long time1 = end.getTimeInMillis() - start.getTimeInMillis();
/******** End ********/
so.flag = 1;//设置flag为1,此后线程2将sleep
/******** Begin ********/
start = Calendar.getInstance();
for(int i = 0; i < 1000; i++) {
System.out.println("thread1 again:" + i);
}
end = Calendar.getInstance();
long time2 = end.getTimeInMillis() - start.getTimeInMillis();
/******** End ********/
System.out.println("第一次打印,用时:" + time1);
System.out.println("第二次打印,用时:" + time2);
so.flag = 2;//设置flag为2,此后线程2将不打印,便于查看结果
}
}
class Thread2 extends Thread {
SyncObject so;
Thread2(SyncObject so) {
this.so = so;
}
@Override
public void run() {
/******** Begin ********/
for(int i = 0; i < 2000; i++) {
if(so.flag == 1) { //若flag为1, 则sleep
try {
sleep(1000);
}
catch(Exception e) {
e.printStackTrace();
}
}
else if(so.flag == 0)//若flag为0,则线程2将不打印,便于查看结果
System.out.println("thraed2:" + i);
/******** End ********/
}
}
}
public class Exe8_7 {
public static void main(String[] args) {
SyncObject so = new SyncObject();
so.flag = 0;
Thread1 tr1 = new Thread1(so);
Thread2 tr2 = new Thread2(so);
/******** Begin ********/
tr1.setPriority(2);
tr2.setPriority(8);//设置线程2优先级高于线程1
tr1.start();
tr2.start();
/******** End ********/
}
}

8.第八关

package step6;
class SonThread extends Thread {
int flag = 0;
@Override
public void run() {
/******** Begin ********/
for (int i = 0; i < 5000; i++) {
if (flag == 0) {
System.out.println("i = " + i);
} else {
return;
}
}
/******** End ********/
}
}
public class Exe8_8 {
public static void main(String[] args) {
/******** Begin ********/
SonThread t = new SonThread();
t.start();
for (int j = 0; j < 200; j++) {
System.out.println("j = " + j);
}
t.interrupt();
t.flag = 1;
for (int j = 2000; j < 4000; j++) {
System.out.println("j = " + j);
}
    }
}

9.第九关

package step7;
import java.util.*;
class Goods {
    Goods(String name, float price) {
        this.name = name;
        this.price = price;
    }
    String name;
    float price;
}
class MyList {
    MyList() {
        goodsList = new ArrayList<Goods>();
    }
    ArrayList<Goods> goodsList;
    //放一个
    public synchronized void put(Goods g) {
        /******** Begin ********/
        goodsList.add(g);
        notifyAll();



        /********  End  ********/
    }
    //放若干个
    public synchronized void put(Goods[] g) {
        /******** Begin ********/
        goodsList.addAll(java.util.Arrays.asList(g));
        notifyAll();



        /********  End  ********/
    }
    //取一个
    public synchronized Goods get() {
        /******** Begin ********/
        while (goodsList.size() == 0) {
        try {
        wait();
        } catch (Exception e) {
// e.printStackTrace();
}
}
Goods g = goodsList.remove(0);
return g;



        /********  End  ********/
    }
    //取若干个,个数为n
    public synchronized Goods[] get(int n) {
        /******** Begin ********/
        while (goodsList.size() < n) {
try {
wait();
} catch (Exception e) {
// e.printStackTrace();
}
}
Goods[] g = new Goods[n];
for (int i = 0; i < n; i++) {
g[i] = goodsList.remove(0);
}
return g;



        /********  End  ********/
    }
}
class MyThread1 extends Thread {
    MyList goodsList;
    MyThread1(MyList goodsList) {
        this.goodsList = goodsList;
    }
    @Override
    public void run() {
        //循环10次,每次放一个
        for (int i = 1; i <= 10; i++) {
            goodsList.put(new Goods("thread1:" + i, (float) i / 10));
            System.out.println(i + ":Thread1 put");
        }
    }
}
class MyThread2 extends Thread {
    MyList goodsList;
    MyThread2(MyList goodsList) {
        this.goodsList = goodsList;
    }
    @Override
    public void run() {
        //循环10次,每次取一个
        for (int i = 1; i <= 10; i++) {
            goodsList.get();
            System.out.println(i + ":Thread2 get");
        }
    }
}
class MyThread3 extends Thread {
    MyList goodsList;
    MyThread3(MyList goodsList) {
        this.goodsList = goodsList;
    }
    @Override
    public void run() {
        //循环10次,每次放两个
        for (int i = 1; i <= 10; i++) {
            Goods[] goods = new Goods[2];
            goods[0] = new Goods("thread3:" + i, (float) i / 20);
            goods[1] = new Goods("thread3:" + i, (float) i / 50);
            goodsList.put(goods);
            System.out.println(i + ":Thread3 put");
        }
    }
}
class MyThread4 extends Thread {
    MyList goodsList;
    MyThread4(MyList goodsList) {
        this.goodsList = goodsList;
    }
    @Override
    public void run() {
        //循环10次,每次取两个
        for (int i = 1; i <= 10; i++) {
            goodsList.get(2);
            System.out.println(i + ":Thread4 get");
        }
    }
}
//测试类
public class Exe8_9 {
    public static void main(String[] args) {
        MyList goodsList = new MyList();
        MyThread1 thread1 = new MyThread1(goodsList);
        MyThread2 thread2 = new MyThread2(goodsList);
        MyThread3 thread3 = new MyThread3(goodsList);
        MyThread4 thread4 = new MyThread4(goodsList);
        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
    }
}

10.第十关

package step8;
class MyThread extends Thread{
    String name;
    StringBuffer sendString;
    StringBuffer recvString;
    MyThread(String name, StringBuffer sendString, StringBuffer recvString) {
        this.name = name;
        this.sendString = sendString;
        this.recvString = recvString;
    }
    @Override
    public void run() {
        //循环100次,每次循环都sleep一段随机事件,然后收发消息
        /******** Begin ********/
        for(int i = 0; i < 100; i++) {
            int time = (int)(Math.random() * 100);
            try {
                sleep(time);
            }
            catch(Exception e) {
                e.printStackTrace();
            }
            sendMsg();
            recvMsg();
         /********  End  ********/
        }
    }
    //发送消息
    public void sendMsg() {
        synchronized(sendString) {
              /******** Begin ********/
            while(sendString.length() > 0) {
                try {
                    sendString.wait();
                }
                catch(Exception e) {
                    e.printStackTrace();
                }
            }
            double content = Math.random();
            sendString.append(name + content);
            /********  End  ********/
            System.out.println(name + " send " + content);
            sendString.notify();
        }
    }
    //接收消息
    public void recvMsg() {
        synchronized(recvString) {
              /******** Begin ********/
            while(recvString.length() == 0) {
                try {
                    recvString.wait();
                }
                catch(Exception e) {
                    e.printStackTrace();
                }
            }
            /********  End  ********/
            System.out.println(name + " recv " + recvString);
            recvString.delete(0, recvString.length());
            recvString.notify();
        }
    }
}
//测试类
public class Exe8_10 {
    public static void main(String[] args) {
        StringBuffer string1 = new StringBuffer();
        StringBuffer string2 = new StringBuffer();
        MyThread thread1 = new MyThread("A", string1, string2);
        MyThread thread2 = new MyThread("B", string2, string1);
        thread1.start();
        thread2.start();
    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值