第十五周Java作业

来源:互联网 发布:mac网游下载 编辑:程序博客网 时间:2024/05/18 00:19

1.题目

编写多线程程序,模拟多个人通过一个山洞。这个山洞每次只能通过一个人,每个人通过山洞的时间为2秒(sleep)。随机生成10个人,都要通过此山洞,用随机值对应的字符串表示人名,打印输出每次通过山洞的人名。提示:利用线程同步机制,过山洞用一条输出语句表示,该输出语句打印输出当前过山洞的人名,每个人过山洞对应一个线程,哪个线程执行这条输出语句,就表示哪个人过山洞。

2.代码:

package 作业;

public class Pass implements Runnable{   
    private Object lock=new Object();   
     public void run(){   
         synchronized(lock){   
            System.out.println(Thread.currentThread().getName());   
            try{   
                 Thread.sleep(1000);   
             }catch(InterruptedException e){   
                e.printStackTrace();   
 }   
       }   
 }   
        
    public static void main(String[] args){   
         Pass p=new Pass();   
         new Thread(p,"ONE").start();   
         new Thread(p,"TWO").start();   
        new Thread(p,"THREE").start();   
         new Thread(p,"FOUR").start();   
         new Thread(p,"FIVE").start();   
         new Thread(p,"SIX").start();   
         new Thread(p,"SEVEN").start();   
         new Thread(p,"EIGHT").start(); 
         new Thread(p,"NINE").start(); 
         new Thread(p,"TEN").start(); 
          
     }    }   

3截图:

1.题目

用两个线程玩猜数字游戏,第一个线程负责随机给出1~100之间的一个整数,第二个线程负责猜出这个数。要求每当第二个线程给出自己的猜测后,第一个线程都会提示“猜小了”、“猜大了”或“猜对了”。猜数之前,要求第二个线程要等待第一个线程设置好要猜测的数。第一个线程设置好猜测数之后,两个线程还要相互等待,其原则是:第二个线程给出自己的猜测后,等待第一个线程给出的提示;第一个线程给出提示后,等待给第二个线程给出猜测,如此进行,直到第二个线程给出正确的猜测后,两个线程进入死亡状态。


2.代码

package 作业;

import java.util.Random;

public class Pass2{
     static Object setnumber=new Object();
     static Object guess=new Object();

     public static void main(String[] args) {
         Question question=new Question(setnumber,guess);
         Answer answer=new Answer(setnumber,guess);
         new Thread(question).start();
         new Thread(answer).start();
     }
 }
 class Question implements Runnable{
     Object setnumber;
     Object guess;
     int number;
     public Question(Object setnumber, Object guess) {
         // TODO Auto-generated constructor stub
         this.setnumber=setnumber;
         this.guess=guess;
     }

     @Override
     public void run() {
         // TODO Auto-generated method stub
         synchronized (setnumber) {
             Random rand = new Random();
             number=rand.nextInt(100);
             State.initialize=1;
             System.out.println("我生成了数字:"+number);
         }
//       synchronized()
         while(true){
             System.out.println("question:"+State.answed);
             if(State.answed!=0){
                 try {
                     Thread.sleep(100);
                 } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
             }else {
                 synchronized (guess) {
                     System.out.println("你猜的是:"+State.answednumber);
                     if(State.answednumber<number){
                         State.answed=-1;
                         System.out.println("猜小了"+State.answed);
                     }if(State.answednumber>number){
                         State.answed=1;
                         System.out.println("猜大了"+State.answed);
                     }if(State.answednumber==number){
                         State.answed=2;
                         System.out.println("猜对了,就是"+State.answed);
                         break;
                     }
                     Thread.yield();
                 }
             }

         }
     }

 }
 class Answer implements Runnable{
     Object setnumber;
     Object guess;
     int min=0;
     int max=100;
     Random rand = new Random();

     public Answer(Object setnumber, Object guess) {
         // TODO Auto-generated constructor stub
         this.setnumber=setnumber;
         this.guess=guess;
     }

     @Override
     public void run() {
         // TODO Auto-generated method stub
         while(State.initialize==0){//如果没有运行question方法就等待。
             try {
                 Thread.sleep(100);
             } catch (InterruptedException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
         synchronized (setnumber) {
             while(true){
                 if(State.answed==0){
                     try {
                         Thread.sleep(100);
                     } catch (InterruptedException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                     }
                 }
                 else {
                     synchronized (guess) {
                         if(State.answed==1){
                             max=State.answednumber;
                             State.answednumber=rand.nextInt(max-min)+min;
                             System.out.println("我猜:"+State.answednumber);
                         }
                         if(State.answed==-1){
                             min=State.answednumber;
                             State.answednumber=rand.nextInt(max-min)+min;
                             System.out.println("我猜:"+State.answednumber);
                         }
                         if(State.answed==2) {
                             System.out.println("我终于猜对了~");
                             break;
                         }
                         State.answed=0;
                         Thread.yield();
                     }
                 }

             }
         }
     }
 }
 class State{
     static int initialize=0;
     static int answed=0;
     static int answednumber=100;
 }

3.截图


总结:

程序在运行期间,处于就绪状态的每个线程都有自己的优先级,main线程(主线程)具有普通优先级。然而线程优先级不是固定不变的,可以通过Thread类的setPriority(int newPriority)方法对其进行设置,该方法中的参数newPriority接收的是1~10之间的整数或者Thread类的三个静态常量。