我试图用两个线程打印数字1-20:
我还有一个用于同步的锁定对象。
我的申请被卡住了。你能告诉我这是什么问题吗?
我的代码:
public class runIt
{
public static void main(String[] args)
{
Odd odd = new Odd("odd thread");
Even even = new Even("even thread");
odd._t.start();
even._t.start();
try{
odd._t.join();
even._t.join();
}
catch (InterruptedException e){
System.out.println(e.getMessage());
}
}
}
public class Constants{
static Object lock = new Object();
}
public class Even implements Runnable{
Thread _t;
String _threadName;
public Even(String threadName){
_threadName = threadName;
_t = new Thread(this);
}
@Override
public void run(){
for (int i = 0; i < 20; i++){
if (i % 2 == 0){
synchronized (Constants.lock){
try{
Constants.lock.wait();
Constants.lock.notifyAll();
}
catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(_threadName + " " + i + " ");
}
}
}
}
}
public class Odd implements Runnable{
Thread _t;
String _threadName;
public Odd(String threadName){
_threadName = threadName;
_t = new Thread(this);
}
@Override
public void run(){
for (int i = 0; i < 20; i++){
if (i % 2 == 1){
synchronized (Constants.lock){
try{
Constants.lock.wait();
Constants.lock.notifyAll();
}
catch (InterruptedException e1){
e1.printStackTrace();
}
System.out.println(_threadName + " " + i + " ");
}
}
}
}
}
我的输出应该是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
感谢您的帮助, 担。
答案 0 :(得分:1)
您错误地使用了synchronized
和wait
,并立即调用了synchronized
中使用的对象,而没有检查里面的同步块一个循环。 永远不要再这样做了。
事实上,发生了什么:
synchronized
行,您可以锁定Constants.lock
wait
行,您释放 Constants.lock
上的锁定并等待来自其他线程的通知。那么你的编程发生了什么:
synchronized
并继续阻止第二个synchronized
,因为首先发布了锁答案 1 :(得分:0)
下面的代码对某人有帮助,
public class MyClass {
private static Object lock = new Object();
public static void main(String args[]){
Runnable runnable1 = new Runnable() {
@Override
public void run() {
for(int i=1; i<20; i=i+2){
synchronized (lock) {
System.out.println("Thread 1: "+i);
try {
lock.notifyAll();
lock.wait();
} catch (InterruptedException e) {
System.out.println("Error in Thread 1: "+e.getMessage());
}
}
}
}
};
Runnable runnable2 = new Runnable() {
@Override
public void run() {
for(int i=2; i<=20; i=i+2){
synchronized (lock) {
System.out.println("Thread 2: "+i);
try {
lock.notifyAll();
lock.wait();
} catch (InterruptedException e) {
System.out.println("Error in Thread 2: "+e.getMessage());
}
}
}
}
};
Thread thread1 = new Thread(runnable1);
Thread thread2 = new Thread(runnable2);
System.out.println("Thread Start: ");
thread1.start();
thread2.start();
}
}
答案 2 :(得分:0)
您可以在软件包声明中提到的站点中找到说明: 这是工作代码:
public class MultipleThreading {
int count = 1;
int MAX = 20;
public void printOdd() {
synchronized (this) {
while (count < MAX) {
while (count % 2 == 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(count + " ");
count++;
notify();
}
}
}
public void printEven() {
synchronized (this) {
while (count < MAX) {
while (count % 2 == 1) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(count + " ");
count++;
notify();
}
}
}
public static void main(String[] args) {
MultipleThreading mt = new MultipleThreading();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
mt.printEven();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
mt.printOdd();
}
});
t1.start();
t2.start();
}
}
答案 3 :(得分:0)
Stack Overflow上的每个人都尝试了相同的解决方案。签出相同的其他实现。
public class PrintSequenceUsingTwo {
public static void main(String[] args) {
ThreadSequence sequence = new ThreadSequence();
Thread t1 = new Thread(()-> {try {
sequence.print();
} catch (InterruptedException e) {
e.printStackTrace();
}},"t1");
Thread t2 = new Thread(()-> {try {
sequence.print();
} catch (InterruptedException e) {
e.printStackTrace();
}},"t2");
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (Exception e) {
e.printStackTrace();
}
}
}
class ThreadSequence {
private static int var = 0;
private int limit = 10; //set the variable value upto which you want to print
public synchronized void print() throws InterruptedException {
while (var<limit) {
notify();
System.out.println("Current Thread "+Thread.currentThread().getName()+" Value : "+(++var));
wait();
}
notify();
}
}
答案 4 :(得分:0)
:)
参考:参考来自GeekforGeeks
答案 5 :(得分:0)
Try this solution.....
public class Print1To20Using2Thread {
public static void main(String[] args) {
PrintNumber pn = new PrintNumber(new Object());
Thread t1 = new Thread(pn, "First");
Thread t2 = new Thread(pn, "Second");
t1.start();
t2.start();
}
}
class PrintNumber implements Runnable {
Object lock;
int i = 0;
public PrintNumber(Object lock) {
this.lock = lock;
}
@Override
public void run() {
synchronized (lock) {
for (; i <= 20; i++) {
if (i == 11) {
try {
lock.wait(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(" "+Thread.currentThread().getName() + " " + i);
lock.notifyAll();
}
System.out.println();
}
}
}