多线程答案

一、选择题

1.编译运行下面的代码会发生什么?

 publicclass Test extends Thread{

   publicstaticvoid main(String argv[]){

      Testb = new Test();

      b.run();

   }

   publicvoid start() {

      for (inti = 0; i <10; i++){

            System.out.println("Value of i = " + i);

       }

   }

}

A.编译错误,Thread类中的run方法没有定义
B.
运行时错误,Thread类中的run方法没有定义
C.
编译无错,打印09
D.编译无错,不打印任何值

 

2.编译运行下面的代码会发生什么?

publicclassAgg {

   publicstaticvoid main(String argv[]) {

      Agg a = new Agg();

      a.go();

    }

    

   publicvoid go() {

       DSRoss ds1 = new DSRoss("one");

       ds1.start();

   }

}

    

class DSRoss extends Thread {

   private String sTname = "";

    

   DSRoss(Strings) {

      sTname = s;

   }

 

   publicvoidrun() {

        notwait();

        System.out.println("finished");

   }

    

   publicvoidnotwait() {

        while (true) {

           try {

                System.out.println("waiting");

                wait();

            } catch (InterruptedException ie) {

            }

            System.out.println(sTname);

            notifyAll();

        }

   }

}

A.  编译错误

B.  能够编译,输出“waiting"

C.  能够编译, 输出“waiting",紧接着输出"finish"

D.运行时错误,会抛异常

 

3.编译运行下面的代码会发生什么?

publicclassTest extendsThread {

   private String sThreadName;

    

   publicstaticvoid main(String argv[]) {

        Test h = new Test();

        h.go();

   }

    

   Test() {

   }

    

   Test(String s){

        sThreadName = s;

   }

    

   publicString getThreadName() {

        returnsThreadName;

   }

    

   publicvoidgo() {

        Test first = new Test("first");

        first.start();

        Test second = new Test("second");

        second.start();

   }

    

   publicvoidstart() {

        for (inti = 0; i < 2; i++) {

            System.out.println(getThreadName()+ i);

            try {

                Thread.sleep(100);

            } catch (InterruptedException e) {

                System.out.println(e.getMessage());

            }

        }

  }

}

A.编译错误
B.
输出first0, second0, first1, second1.
C.输出first0, first1, second0, second1.
D.
运行时错误

编译运行下面的代码会发生什么

publicclassTest {

   publicstaticvoidmain(String argv[]){

        Pmcraven pm1 = new Pmcraven("one");

        pm1.run();

        Pmcraven pm2 = new Pmcraven("two");

        pm2.run();

   }

}

 

class Pmcraven extends Thread {

   privateString sTname= "";

 

   Pmcraven(String s) {

        sTname = s;

    }

 

   publicvoidrun() {

        for (inti = 0; i < 2; i++) {

            try {

                sleep(1000);

            } catch (InterruptedException e) {

            }

            yield();

            System.out.println(sTname);

        }

   }

}

A.编译错误
B.输出One One Two Two
C.输出One Two One Two
D.
输出One Two One Two

 

二、简单题

1 当一个线程进入到一个对象的synchronized方法,那么其他线程是否可以进入该对象的其它方法?

     如果其它方法加了static关键字,那么该方法属于类,不属于对象,不能与对象的方法保持同步(即使有synchronized关键字),是能进入的。

如果其它方法不带有static关键字且带有synchronized关键字,那么不能进入,如果不带,则能。

 

2 sleep()和wait()有何异同?

1) wait是Object类的方法,而sleep()是Thread类的静态方法

2) sleep没有释放出锁,而wait释放了锁

3) wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 

4) sleep需要捕获异常,而wait不需要

 

三、编程题

1 现在有T1 T2 T3三个线程,怎样保证T2在T1执行完之后执行 T3在T2执行完之后执行。

public class JoinDemo{

    public static void main(String[] args) {

       T1 t1=new T1("T1");

       T2 t2=new T2("T2");

       T3 t3=new T3("T3");

       t1.start();

       try {

           t1.join();

       } catch (InterruptedException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       t2.start();

       try {

           t2.join();

       } catch (InterruptedException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       t3.start();

    }

}

 

class T1 extends  Thread{

    private String name;

    public T1(String name) {

       this.name=name;

    }

 

    @Override

    public void run() {

       for(int i=0;i<5;i++){

           try {

              sleep(5);

           } catch (InterruptedException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

           System.out.println(this.name+"循环"+i);

       }

    }

}

class T2 extends  Thread{

    private String name;

    public T2(String name) {

       this.name=name;

    }

    @Override

    public void run() {

       for(int i=0;i<5;i++){

           try {

              sleep(5);

           } catch (InterruptedException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

           System.out.println(this.name+"循环"+i);

       }

    }

}

class T3 extends  Thread{

    private String name;

    public T3(String name) {

       this.name=name;

    }

    @Override

    public void run() {

       for(int i=0;i<5;i++){

           System.out.println(this.name+"循环"+i);

       }

    }

}

3 将 1到999999的加和平均分配到3个线程计算,然后再将加和的结果汇总。

publicclassTestVolatile {

   publicstaticvoid main(String args[]){

      M.Start();

      System.out.println("Finnish!");

   }

}

 

class M{

   privatestaticvolatilelonga=0;

 

   publicstaticvoid Start(){

      Threadthread1=new Thread(new Runnable() {

         publicvoid run() {

            for(inti=1;i<333333;i++){

                a+=i;

            }

            System.out.println(a);

         }

      });

 

   Threadthread2=new Thread(new Runnable() {

      publicvoid run() {

         for(inti=3333333;i<666666;i++){

            a+=i;

         }

         System.out.println(a);

      }

   });

  

   Threadthread3=new Thread(new Runnable() {

      publicvoid run() {

         for(inti=6666666;i<1000000;i++){

            a+=i;

         }

         System.out.println(a);

      }

   });

   thread1.start();

   thread2.start();

   thread3.start();

   }

}

 

4 使用主线程获取键盘输入,并写入1.txt文件,使用新线程从文件中读取内容,并在控制台打印出来(需用同步锁保证写文件操作,只有写完文件,才能读取文件)。

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.Scanner;

 

publicclassTest extendsThread{

   private File file = null;

  

   publicstaticvoid main(String[] args){

      Testt = new Test();

      t.writeFile();

      t.start();

   }

   publicvoid writeFile(){

      file = new File("1.txt");

      Scannernum= newScanner(System.in);

      System.out.println("请输入要录入的内容:");

      Stringb = num.nextLine();

      BufferedWriterwriter;

      synchronized(file){

         try {

            writer = new BufferedWriter(new FileWriter(file));

            writer.write(b);

            writer.flush();

            writer.close();

         }catch(IOException e) {

            e.printStackTrace();

         }

      }

   }

  

   @Override

   publicvoid run() {

      try {

         if(!file.exists()){

            return;

         }

         BufferedReaderbr = new BufferedReader(new FileReader(file));

         Strings = null;

         while((s=br.readLine())!=null){

            System.out.print(s);

         }

         br.close();

      }catch(FileNotFoundException e) {

         e.printStackTrace();

      }catch (IOException e) {

         e.printStackTrace();

      }

     

   }

}

 

 

  

  

 答案是老师滴  我概不负责对错,,我只负责抄作业!

 

 

 

 


猜你喜欢

转载自blog.csdn.net/zuoside__lord/article/details/80223630