当我编译并运行StartThreads类时,我会得到一个包含1到1000000的整数列表,其中包含false,最后显示true;现在我想弄清楚的是,为什么threadone类应该打印一次MyVariables类中的实例变量时却什么也不打印?公共类MyVariables{public boolean startApp=false;}
public class ThreadOne implements Runnable {
Thread t;
MyVariables x;
public ThreadOne(MyVariables x) {
t = new Thread(this, "Thread One");
this.x = x;
}
@Override
public void run() {
while(this.x.startApp != false) {
System.out.println("Starting");
}
}
public void start() {
t.start();
}
}
public class ThreadTwo implements Runnable {
Thread t;
MyVariables x;
public ThreadTwo(MyVariables x) {
t = new Thread(this, "Thread One");
this.x = x;
}
@Override
public void run() {
synchronized(this.x) {
for(int i = 0; i <= 1000001; i++) {
if(i == 1000001) {
this.x.startApp = true;
System.out.println(this.x.startApp);
}
else {
System.out.println(this.x.startApp);
System.out.println(i);
}
}
}
}
public void start() {
t.start();
}
}
public class StartThreads {
public static void main(String[] args) {
MyVariables a = new MyVariables();
ThreadOne x = new ThreadOne(a);
ThreadTwo y = new ThreadTwo(a);
x.start();
y.start();
}
}
为什么ThreadOne要像您所说的那样行事?它是while循环从不运行,而是跳过,因为条件不是true。我认为您希望它等待某个内容更改为true,但它不做这种事情,相反,一旦它看到一个条件为false,就完成执行。
注意,这是一段丑陋的代码:
while(this.x.startApp != false) {
为什么要陈述某件事不是假的?这和事实是一样的。更好
while (x.startApp) {
现在,至于您的实际问题,也许您应该创建while循环:
while (!x.startApp) {
Thread.sleep(1); // surrounded with try/catch
}
System.out.println("Starting");
例如,
class ThreadOne implements Runnable {
Thread t;
volatile MyVariables x;
public ThreadOne(MyVariables x) {
t = new Thread(this, "Thread One");
this.x = x;
}
@Override
public void run() {
while (!x.startApp) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
}
System.out.println("Starting");
}
public void start() {
t.start();
}
}
class ThreadTwo implements Runnable {
private static final int MAX_I = 10001;
Thread t;
volatile MyVariables x;
public ThreadTwo(MyVariables x) {
t = new Thread(this, "Thread One");
this.x = x;
}
@Override
public void run() {
synchronized (this.x) {
for (int i = 0; i <= MAX_I; i++) {
if (i == MAX_I) {
this.x.startApp = true;
System.out.println(this.x.startApp);
} else {
System.out.println(this.x.startApp);
System.out.println(i);
}
}
}
}
public void start() {
t.start();
}
}
public class StartThreads {
public static void main(String[] args) {
MyVariables a = new MyVariables();
ThreadOne x = new ThreadOne(a);
ThreadTwo y = new ThreadTwo(a);
x.start();
y.start();
}
}
class MyVariables {
public volatile boolean startApp = false;
}
另外,我认为布尔字段至少应该是易变的。
使用PropertyChangeListener和观察者模式的另一种方法:
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class StartThreads2 {
public static void main(String[] args) {
final MyVariables2 myVars2 = new MyVariables2();
final RunOne runOne = new RunOne();
final RunTwo runTwo = new RunTwo(myVars2);
myVars2.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent pcEvt) {
if (MyVariables2.START_APP.equals(pcEvt.getPropertyName())) {
if (pcEvt.getNewValue().equals(Boolean.TRUE)) {
new Thread(runOne).start();
}
}
}
});
new Thread(runTwo).start();
}
}
class MyVariables2 {
public static final String START_APP = "start app";
private volatile boolean startApp = false;
private PropertyChangeSupport pcSupport = new PropertyChangeSupport(this);
public boolean isStartApp() {
return startApp;
}
public void setStartApp(boolean startApp) {
boolean oldValue = this.startApp;
boolean newValue = startApp;
this.startApp = startApp;
pcSupport.firePropertyChange(START_APP, oldValue, newValue);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
pcSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
pcSupport.removePropertyChangeListener(listener);
}
}
class RunOne implements Runnable {
@Override
public void run() {
System.out.println("Starting RunOne");
}
}
class RunTwo implements Runnable {
private static final int MAX_I = 10001;
private MyVariables2 myVars2;
public RunTwo(MyVariables2 myVars2) {
this.myVars2 = myVars2;
}
@Override
public void run() {
for (int i = 0; i <= MAX_I; i++) {
System.out.println("startApp: " + myVars2.isStartApp());
System.out.printf("i: %05d%n", i);
}
myVars2.setStartApp(true);
try {
Thread.sleep(10);
} catch (InterruptedException e) {}
System.out.println("startApp: " + myVars2.isStartApp());
}
}
问题内容: 我是Java新手。有人可以帮我为什么不调用Run方法。提前致谢。 问题答案: 您需要将的实例传递给构造函数,以告诉新线程运行什么: (这是不幸的是,类已经以各种方式被设计得不好。这将是更有益的,如果它 不 具有方法本身,但 没有 强迫你传递到构造函数,然后你会发现在编译的问题-时间。)
我正在运行一个记录的测试计划。我在线程组中分配了5个不同的用户,上升周期为5,循环计数为1。 这就是发生的情况: 开始测试。 测试运行没有错误,并且当我在视图结果树中检查时,似乎5个用户正确执行,但当我在系统中检查时,只有2或3个用户注册。我删除注册的用户,并运行脚本一次又一次的2或3个用户注册(有些时间不一样)的5个用户。 我不明白怎么会让我的测试表现得那样...为什么我的测试计划没有为5个用户
问题内容: 有没有简单的解决方案,可以在新线程中使用JPA将数据保存到数据库中? 我基于Spring的Web应用程序允许用户管理计划的任务。在运行时,他可以创建和启动预定义任务的新实例。我正在使用spring的TaskScheduler,并且一切正常。 但是我需要将每个被激发任务的布尔结果保存到数据库中。我怎样才能做到这一点? 编辑:我必须概括我的问题:我需要从任务在我的@Service类上调用方
主要内容:1 什么是Java join()方法,2 Java join()方法语法,3 Java join()方法例子1,4 Java join()方法例子21 什么是Java join()方法 Java join() 方法表示等待线程死亡。换句话说,它导致当前正在运行的线程停止执行,直到与之连接的线程完成其任务为止。 2 Java join()方法语法 3 Java join()方法例子1 输出结果为: 如上例所示,当t1完成其任务时,t2和t3开始执行。 4 Java join()方法例子2
我尝试使用ImageJ库来处理图像。我的问题是,有些线程从未停止过。Eclipse总是向我显示一个正在运行的活动线程。如果我向下面的函数传递一个大于0的值,就会发生这种情况。似乎只要ImageJ有要处理的东西,它就会在内部打开一个线程(例如,blurGaussian(0.1)。 我怎么才能阻止这条线? 我的代码: 使用的库:https://mvnrepository.com/artifact/ne
我有一个主要的方法,它应该从一个乐高机器人的数据绘制一个地图,主线程应该处理它从机器人获得的数据: } 如何从线程获取数据来更新GUI?