Столкнулся с проблемой синхронизации в java, с помощью synchronized(). Не удается синхронизировать потоки в двух кодах. Первый - есть два потока, созданные разными способами. Один - генерирует рандомное число и пишет в буфер. Второй поток - пишет Hello столько раз - какое число сгенерировал первый. Код: | Код | import java.util.Random; public class NewThread { public int Buff = -1; public boolean state = true; public boolean stop = false; public Object lock = new Object();
public class ThreadOne implements Runnable { Thread t; ThreadOne() { t = new Thread(this, "ThreadOne"); System.out.println("ThreadOne" + t); t.start(); } @Override public void run() { // TODO Auto-generated method stub int a = 10; while(a > 0) { System.out.println("000000000"); synchronized(lock) { if (Buff != -1) { System.out.println("11111111"); try { lock.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("22222222"); //if(state) //{ Random r = new Random(); Buff = r.nextInt(9); a--; //state = !state; //} lock.notifyAll(); } } } }//end ThreadOne public class ThreadTwo extends Thread { ThreadTwo() { super("ThreadTwo"); System.out.println("ThreadTwo" + this); start(); } public void run() { int a = 10; while(a > 0) { synchronized(lock) { System.out.println("33333333"); try { lock.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("44444444"); //if(!state) //{ for(int i = 0; i < Buff; i++) System.out.println("Hello " + Buff); System.out.println("-------"); a--; //state = !state; //} lock.notifyAll(); System.out.println("55555555"); } } } } public static void main(String[] args) { NewThread nt = new NewThread(); Runnable tt = nt.new ThreadTwo(); Runnable to = nt.new ThreadOne(); } }
|
Во втором задание вводятся две переменные. Первая - кол-во потоков. Вторая - число, которое мы будем уменьшать. Надо запустить несколько потоков, которые будут уменьшать это число и выводить его не экран. | Код |
public class Thread1 { public int a, b, num; public boolean start = false; public Object lock = new Object(); /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Thread1 t = new Thread1(); t.num = 1; t.a = t.b = Integer.parseInt(args[1]); for (int i = 0; i < Integer.parseInt(args[0]); i++) { Runnable nt = t.new Threads(); Thread n = new Thread(nt); n.start(); } t.start = true;
} public class Threads implements Runnable { @Override public void run() { // TODO Auto-generated method stub int number = ++num; while(start) while(true) { //System.out.println("1111111"); synchronized(lock) { if((a != b) && (number != 1)) { try { //System.out.println("222222"); lock.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(a == 0) break; a--; System.out.println(Integer.toString(number) + " " + Integer.toString(a)); lock.notifyAll(); } } } } }
|
|