gpt4 book ai didi

java - java信号量的问题

转载 作者:行者123 更新时间:2023-12-02 00:40:23 25 4
gpt4 key购买 nike

我是java新手,我只是想通过下面的例子来感受一下这种语言。谁能告诉我为什么下面的程序只显示:

     calling prod
calling cons

import java.util.concurrent.*;

public class Trial5 {
static public void main(String[] arg){
new Prod();
new Cons();
}
}

class Q {
static Semaphore semc = new Semaphore(0);
static Semaphore semp = new Semaphore(1);
static int q[];
}

class Cons implements Runnable{
Thread t;
Cons () {
System.out.println("calling cons");
Thread t = new Thread();
t.start();
}
public void run () {
System.out.println("Running semc");
try {
System.out.println ("Waiting for Data.Acquiring semc");
Q.semc.acquire ();
if(Q.q[0] != 0) {
System.out.println(Q.q[0]);
Q.q[0] = 0;
} else {
wait ();
}
System.out.println ("Releasing semc");
Q.semc.release ();
}
catch (Exception e) {
System.out.println (e.getMessage());
}
}
}

class Prod implements Runnable {
Thread t;
Prod () {
System.out.println ("calling prod");
t = new Thread ();
t.start ();
}
public void run() {
System.out.println ("running semp");
try {
System.out.println ("Waiting for Data.Acquiring semp");
Q.semp.acquire ();
if (Q.q[0] == 0) {
System.out.println ("setting value semp");
Q.q[0] = 10;
} else {
Thread.sleep(100);
}
System.out.println ("Releasing semp");
Q.semp.release ();
}
catch (Exception e) {
System.out.println (e.getMessage());
}
}
}

最佳答案

您的问题不在于信号量,而在于您的线程。您的 run 方法未执行,因为您正在实例化 Thread 的新实例,该实例不知道您创建的类并运行这些实例,而不是对您创建的类执行任何操作。所以你的 run 方法永远不会被调用。

具体来说,像这样的行:

Thread t = new Thread();
t.start();

没有引用它们所包含的类。它们只是创建一个新的 Thread 对象,该对象只有默认的 run 方法,然后启动它。

This site有线程如何运行的示例(通过扩展 Thread 或通过实现 Runnable)。不过,您将必须重新构建一些代码才能使其正常工作。尽管简单地更改要读取的行可能会起作用

Thread t = new Thread(this);

这是一个坏主意,因为您将在对象的构造函数仍在运行时将对象作为值传递。更好的想法是让您的 main 方法构造每个对象,然后使用它们来启动线程运行。

关于java - java信号量的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6561335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com