есть два задания. Первое - два потока созданы двумя способами. Один поток генерирует рандомное число и записывает его в общий буфер. Второй поток - берет это число и столько раз выводит Hello. Использую просто булевы переменные - получилось синхронизировать, а с помощью synchronized() wait() и notify() - не получается. Вот код:
Цитата:
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();
}
}
|
И второе задание - программа с двумя переменными. Первое - число потоков. Второе - число, которое поток будет уменьшать. Так же не получается синхронизировать. На wait() виснет. Код:
Цитата:
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();
}
int y=0;
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();
}
}
}
}
}
|