四个线程t1,t2,t3,t4,向4个文件中写入数据,t1只能写入1,t2只能写入2,t3只能写入3,t4只能写入4,对4个文件A,B,C,D写入如下内容: A:123412341234..... B:234123412341.... C:341234123412.... D:412341234123.... 怎么实现同步可以让线程并行工作?import java.io.FileWriter; import java.io.PrintWriter; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class Hello { static boolean b=false; static ReentrantLock lock=new ReentrantLock(); static ReentrantLock lock_2=new ReentrantLock(); static Condition condition_for=lock.newCondition(); //线程Thread_t1~Thread_t4分别只写入1~4 class Thread_t1 extends Thread { String path; Thread_t1(String path) { this.path=path; } public void run() { print(path,1); } } class Thread_t2 extends Thread { String path; Thread_t2(String path) { this.path=path; } public void run() { print(path,2); } } class Thread_t3 extends Thread { String path; Thread_t3(String path) { this.path=path; } public void run() { print(path,3); } } class Thread_t4 extends Thread { String path; Thread_t4(String path) { this.path=path; } public void run() { print(path,4); } } //写入方法 public void print(String path, int i) { lock_2.lock(); PrintWriter pw=null; try { pw=new PrintWriter(new FileWriter("c:/work/abcd/"+path+".txt",true),true); pw.print(i); } catch (Exception e) { e.printStackTrace(); }finally{ pw.close(); lock_2.unlock(); } } //文件类A~D class File_A implements Runnable { int one,two,three,four; File_A(int one,int two, int three, int four) { this.one=one; this.two=two; this.three=three; this.four=four; } public void run() { for(int x=0;x<100;x++) { select("A",one,two,three,four); } } } class File_B implements Runnable { int one,two,three,four; File_B(int one,int two, int three, int four) { this.one=one; this.two=two; this.three=three; this.four=four; } public void run() { for(int x=0;x<100;x++) { select("B",one,two,three,four); } } } class File_C implements Runnable { int one,two,three,four; File_C(int one,int two, int three, int four) { this.one=one; this.two=two; this.three=three; this.four=four; } public void run() { for(int x=0;x<100;x++) { select("C",one,two,three,four); } } } class File_D implements Runnable { int one,two,three,four; File_D(int one,int two, int three, int four) { this.one=one; this.two=two; this.three=three; this.four=four; } public void run() { for(int x=0;x<100;x++) { select("D",one,two,three,four); } } } //选择线程方法,当前只允许进入一个文件线程 public void select(String path,int one,int two, int three, int four) { lock.lock(); try { while(b) { condition_for.await(); } b=true; int[] order={one,two,three,four};//将传入的1234,换成数组方便用for遍历 for(int i:order) { switch(i){ case 1: Thread_t1 t1= new Thread_t1(path); t1.start(); t1.join(); //t1.join()是等线程t1执行完后再执行当前线程 break; case 2: Thread_t2 t2= new Thread_t2(path); t2.start(); t2.join(); break; case 3: Thread_t3 t3= new Thread_t3(path); t3.start(); t3.join(); break; case 4: Thread_t4 t4= new Thread_t4(path); t4.start(); t4.join(); break; } } b=false; }catch(Exception e){ e.printStackTrace(); }finally{ lock.unlock(); } } //主函数 public static void main(String args[]) { HelloJava hj=new HelloJava(); new Thread(hj.new File_A(1,2,3,4)).start(); new Thread(hj.new File_B(2,3,4,1)).start(); new Thread(hj.new File_C(3,4,1,2)).start(); new Thread(hj.new File_D(4,1,2,3)).start(); } }
一道关于笔试的多线程题目
最新推荐文章于 2022-11-05 16:49:02 发布