java多线程

来源:互联网 发布:sql数据库修复软件 编辑:程序博客网 时间:2024/06/07 07:56

实验过程:

(源程序代码,即.java文件)

第一题:

/*1  建立一个线程,其任务是每隔1s生成一个随机数;要求分别使用以下方法:

   继承Thread

  实现Runnable接口的方法

*/

package szu.cn;

import java.util.*;

 

public class thread_1 extends Thread  {

 

    /**

     * @param args

     */

    public void run(){

        while(true){

        Random random1=new Random();

        System.out.println(this.currentThread()+"thread方式随机数为:"+random1.nextInt());

        try {

            sleep(1000);

        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        }

    }

    public static void main(String[] args) {

        // TODO Auto-generated method stub

           System.out.println("nimen");

           thread_1 thread1=new thread_1();

           threadrunable thread_runable=new threadrunable();

           Thread thrd_run=new Thread(thread_runable);

           thread1.start();

           thrd_run.start();

         }

 

}

class threadrunableimplements Runnable {

 

    @Override

    public void run() {

        // TODO Auto-generated method stub

        while(true){

            Random random1=new Random();

            System.out.println("runable方式随机数为:"+random1.nextInt());

            try {

                Thread.sleep(1000);

            } catch (InterruptedException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

            }

       

    }

 

 

   

}

第二题:

package szu.cn;

 

import java.util.Random;

 

/*要求:两个线程同时运行,一个线程负责生成随机数,每生成一个休眠1s

 * 另外一个线程逐个检查该检查随机数,确定它是否是素数,每检查一个休眠1s

 * 主线程负责检查生成的随机数超过90就结束程序。*/

public class thread_2 {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

        // TODO Auto-generated method stub

       Check check=new Check();

       random_1 ran=new random_1(check);

       Thread t1=new Thread(ran);

       t1.start();

       check_num ch=new check_num(check);

       Thread t2=new Thread(ch);

       t2.start();

       while(check.num!=10){

        try {

            Thread.sleep(1);

        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

       }

      check.flag=false;

    }

 

}

class random_1implements Runnable{

    Check check;

    random_1(Check check){

        this.check=check;

    }

    @Override

    public void run() {

        // TODO Auto-generated method stub

     

        while(check.flag){

            //  synchronized(check){

              check.random_t();

             try {

                  Thread.sleep(1000);

             }    catch (InterruptedException e) {

            // TODO Auto-generated catch block

                       e.printStackTrace();

                   }

        //}

     }

    }

}

class check_numimplements Runnable{

    Check check;

    check_num (Check check){

        this.check=check;

    }

    @Override

    public void run() {

        // TODO Auto-generated method stub

        //System.out.println("是素数");

       

        while(check.flag){

            //if(check.num==90) break;

            //int sushu=check.sushu;

        check.sushu(check.sushu);

        try {

             Thread.sleep(1000);

         }   catch (InterruptedException e) {

            // TODO Auto-generated catch block

                 e.printStackTrace();

             }

            }

       

    }

   

}

class Check {

    int num=0;

    int sushu;

    boolean flag=true;

    synchronized  void random_t(){

         Random random1=new Random();

         sushu=random1.nextInt()%100;

            System.out.println(""+num+"随机数为:"+sushu);

            num++;

     }

    synchronized  boolean sushu(int ar){//这种方法判断素数效率很低,可以利用筛选法进行素数的判断

      boolean tag=true;

      if(ar<2)return tag;

      for(int i=ar-1;i>1;i--){

          if(ar%i==0){

              tag=false;

              break

          }

      } 

      if(tag)

      System.out.println(ar+"是素数");

      return tag;

  }

 

}

 

第三题:

 

package szu.cn;

 

import java.text.SimpleDateFormat;

import java.util.Date;

 

/*编写java应用程序,在主线程中有2个线程:PrintTimeSupervisor。线程PrintTime负责输出当前的时间,共输出10

 * ,每输出一个就准备休息5sSupervisor线程一直在吵醒PrintTime线程。当PrintTime工作完成后,Supervisor线程也结束运行。*/

public class thread_3 {

      public static void main(String[] args) {

            PrintTime tr1=new PrintTime();

            tr1.start();

            Supervisor tr2=new Supervisor(tr1);

            tr2.start();

      }

}

 

class PrintTimeextends Thread {

    int num=0;

    boolean flag=true;

    @Override

    public void run() {

      

            System.out.println("start");

            while(num<10) {

                ///

                //数据处理

                ///

              SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式

              System.out.println(df.format(new Date()));// new Date()为获取当前系统时间

              num++;

              try {

                    sleep(5000);

                } catch (InterruptedException e) {

                    // TODO Auto-generated catch block

                //  e.printStackTrace();

                }  

            }

      

        //System.out.println("stop");

        //super.run();

        flag=false;

    } 

}

 

class Supervisorextends Thread {

     PrintTime p;

     Supervisor(PrintTime p){

        this.p=p;

        }

    @Override

    public void run() {

      while(p.flag){

      try {

            sleep(1000);

        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

      p.interrupt();

        //super.run();

      }

    } 

}

 

 

 

 

 

实验结果及数据处理分析:

 

      ( 运行程序截图)

      第一题:

第二题:



第三题:


 

实验结论:

  多线程可以提高资源的利用率,但是多线程中的公用的资源部分要进行同步。Sleep和wait的区别:

1这两个方法来自不同的类分别是Thread和Object

2. 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

3.s leep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

 

实验收获及思考

    (实验心得)

线程同步是个很重要的概念:与linux C编程的同步锁,条件变量锁是有同工之美;

sleep属于程序的,如果睡不好就会有异常,如被interreput了,而wait是属于对象的,就没有异常这个概念了

wait的概念和C下的linux编程的条件变量锁的概念是一样的。

 

 

 

 

 

 

 

 

 

0 0