实验十七 线程同步控制

                                                                                                                                             实验十七  线程同步控制

                                                                                                                                                                                  实验时间 2018-12-10

1、实验目的与要求

(1) 掌握线程同步的概念及实现技术; 

(2) 线程综合编程练习

2、实验内容和步骤

实验1:测试程序并进行代码注释。

测试程序1:

l 在Elipse环境下调试教材651页程序14-7,结合程序运行结果理解程序;

l 掌握利用锁对象和条件对象实现的多线程同步技术。

实验结果:

 

测试程序2:

l 在Elipse环境下调试教材655页程序14-8,结合程序运行结果理解程序;

l 掌握synchronized在多线程同步中的应用。

实验结果:

 

测试程序3:

l 在Elipse环境下运行以下程序,结合程序运行结果分析程序存在问题;

l 尝试解决程序中存在问题。

class Cbank

{

     private static int s=2000;

     public   static void sub(int m)

     {

           int temp=s;

           temp=temp-m;

          try {

      Thread.sleep((int)(1000*Math.random()));

    }

           catch (InterruptedException e)  {              }

           s=temp;

           System.out.println("s="+s);

   }

}

 

 

class Customer extends Thread

{

  public void run()

  {

   for( int i=1; i<=4; i++)

     Cbank.sub(100);

    }

 }

public class Thread3

{

 public static void main(String args[])

  {

   Customer customer1 = new Customer();

   Customer customer2 = new Customer();

   customer1.start();

   customer2.start();

  }

}

修改后的代码:

package a;

class Cbank
{
     private static int s=2000;
     public  synchronized static void sub(int m)
     {
           int temp=s;
           temp=temp-m;
          try {
                 Thread.sleep((int)(1000*Math.random()));
               }
           catch (InterruptedException e)  {              }
              s=temp;
              System.out.println("s="+s);
          }
    }


class Customer extends Thread
{
  public void run()
  {
   for( int i=1; i<=4; i++)
     Cbank.sub(100);
    }
 }
public class Thread3
{
 public static void main(String args[])
  {
   Customer customer1 = new Customer();
   Customer customer2 = new Customer();
   customer1.start();
   customer2.start();
  }
}

实验运行结果:

 

 

实验2 编程练习

利用多线程及同步方法,编写一个程序模拟火车票售票系统,共3个窗口,卖10张票,程序输出结果类似(程序输出不唯一,可以是其他类似结果)。

Thread-0窗口售:第1张票

Thread-0窗口售:第2张票

Thread-1窗口售:第3张票

Thread-2窗口售:第4张票

Thread-2窗口售:第5张票

Thread-1窗口售:第6张票

Thread-0窗口售:第7张票

Thread-2窗口售:第8张票

Thread-1窗口售:第9张票

Thread-0窗口售:第10张票

实验源代码:

package ThreadTest;

public class Demo1 extends Thread {
    static int t = 1;

    public void run() {
        synchronized (this) {
            while (t <= 10) {
                if (t <= 10) {
                    System.out.println(Thread.currentThread().getName() + "窗口售:第" + t + "张票");
                    t++;
                } else {
                    System.out.println("票卖完了");
                }
            }
            try {
                sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Demo1 window1 = new Demo1();
        Demo1 window2 = new Demo1();
        Demo1 window3 = new Demo1();
        window1.start();
        window2.start();
        window3.start();
    }

}

实验结果:

实验总结:

 

多线程调度:

Java提供一个线程调度器来监控程序启动后进入可运行状态的所有线程。线程调度器按照线程的优先级决定应调度哪些线程来执行。

– 处于可运行状态的线程首先进入就绪队列排队等候处理器资源,同一时刻在就绪队列中的线程可候多个。Java的多线程系统会给每个线程自动分配一个线程的优先级。

守护线程:

 守护线程的惟一用途是为其他线程提供服务。例如计时线程。

 若JVM的运行任务只剩下守护线程时,JVM就退出了。

 在一个线程启动之前,调用setDaemon方法可将线程转换为守护线程(daemon thread)

实验课总结:本周的实验课相对来说比较轻松,学习了多线程的处理技术,在老师和助教的及讲解下,我对此知识有了更深的理解。

posted @ 2018-12-22 15:56  只当梦醒  阅读(390)  评论(0编辑  收藏  举报