- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 Java 中的线程,我有以下程序。 ThreadA 中的 while threadA 条件检查似乎并不像我预期的那样频繁。我在控制台窗口中看到的唯一 println 语句包含大于 100 的 i 变量。它似乎在等待并慢慢打印到控制台。我想这会在一秒钟左右完成。我显然在这里误解了一些东西,关于为什么 ThreadTester 没有打印 100 次的任何想法?
public class ThreadTester {
public static void main(String[] args) {
ThreadA threadA = new ThreadA();
threadA.start();
}
}
public class ThreadA extends Thread{
private volatile Thread threadA = Thread.currentThread();
public void run() {
while(threadA == Thread.currentThread()){
for(int i=0; i<100; i++){
System.out.println("ThreadA " + i);
}
}
}
public void stopThread(){
threadA = null;
}
}
示例输出:
ThreadA 120
ThreadA 121
ThreadA 122
ThreadA 123
ThreadA 124
ThreadA 125
ThreadA 126
ThreadA 127
ThreadA 128
ThreadA 129
ThreadA 130
ThreadA 131
ThreadA 132
ThreadA 133
ThreadA 134
ThreadA 135
ThreadA 136
如何杀死一个线程
Thread 类有一个方法,stop(),它应该知道如何终止当前线程。但它在很多年前就被弃用了,因为它可能会使程序中的某些对象进入不一致的状态,这是由于对象实例的锁定和解锁不当而导致的。
杀死线程有不同的方法。其中之一涉及在线程上创建您自己的方法,例如 stopMe(),在该方法中您将自己的 boolean 变量(例如 stopMe)设置为 false,并在线程的方法 run() 中定期测试它的值。如果应用程序代码将 stopMe 的值设置为 true,则只需退出方法 run() 中的代码执行。在 list 20-10 中,方法 run 中的循环检查变量 stopMe 的值,该变量是使用对当前 Thread 对象的引用初始化的。一旦更改(在本例中设置为 null),处理就会完成。
变量 stopMe 已使用 volatile 关键字声明,它警告 Java 编译器另一个线程可以修改它并且该变量不应缓存在寄存器中,因此所有线程必须始终看到它的新值。
关于如何构造线程以便在需要时可以终止它的书籍示例代码:
class KillTheThread{
public static void main(String args[]){
Portfolio4 p = new Portfolio4("Portfolio data");
p.start();
// Some other code goes here,
// and now it's time to kill the thread
p.stopMe();
}
}
class Portfolio4 extends Thread{
private volatile Thread stopMe = Thread.currentThread();
public void stopMe() {
stopMe = null;
}
public void run() {
while (stopMe == Thread.currentThread()) {
try{
//Do some portfolio processing here
}catch(InterruptedException e ){
System.out.println(Thread.currentThread().getName()
+ e.toString());
}
}
}
最佳答案
threadA
字段由主线程初始化,在 ThreadA
对象成为当前线程之前,因此它的值被设置为主线程。当循环运行时,ThreadA
是当前线程,因此不会发生迭代。您在重新启动 Eclipse 之前获得的奇怪输出可能是由于 Eclipse 运行了您的代码的先前版本。
关于java - volatile Thread 不等于 Thread.currentThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17507941/
根据小节 11.4.8 ECMAScript 5.1 标准: The production UnaryExpression : ~ UnaryExpression is evaluated as fo
我正在尝试构建一个“新评论”功能,向用户显示自上次访问以来的新评论数量。我构建了一个“ View ”表,其中包含主题 ID、用户 ID 和时间戳。每次用户访问该主题时更新时间戳或插入新行(如果不存在)
如标题所述,为什么: > !!1=="1" 等于 True 和 > !!2=="2" 等于: False 同样,为什么 > "1"==true 等于 true 而 > "2"==true 等于 fal
我在 Stack Overflow post 上看到了下图 但是,我对“p OR q”、“p AND q”的结果感到困惑,其中“p”等于“false”,“q”等于“unknown”。 在图中,“p O
一栏有效 whereJsonContains('VehicleApplications' ,['ModelName' => $model, 'YearID' => $year] )->
如果满足条件,我如何才能只获取特定记录? 我有代码为 "SELECT a.id, a.text, a.uid, a.time FROM story a INNER JOIN friends b
我正在尝试运行 MongoDB 查询并返回字段为空的记录(更具体地说,在 pyMongo 中为 None)。所以它必须等于 null。 我知道这不等于: {"firstName": {"$ne": N
我在 Java 中进行单元测试时遇到问题。 我把我的代码和错误放在这里。在互联网上我发现这是哈希码的问题。我需要重新创建它们,但我不知道为什么以及如何。 我的方法: public void setGr
如何在 Typescript 中实现 equals? 我尝试了几种方法,都没有奏效。 选项1: abstract class GTreeObject{ abstract equals(obj:
我查看了很多地方,大多数 arraylist 示例都使用“String”作为元素,但是很难找到使用对象的地方。 假设我正在制作一个图书 Collection ,并且我有一个作者对象: class Au
$a,$b,$c = 1,2,3; print "$a, $b, $c\n"; 返回 , , 1 那么 = (equals) 是否比元组构造具有更高的优先级 - 这样做? $a,$b,($c=1
在此代码片段中,a 和 i 分别具有什么值以及为什么? int i = 1; int a = i++; 是a == 1还是a == 2? 最佳答案 a==1。然后,i==2 如果你这样做的话,那就是a
我觉得我遗漏了一些明显的东西。这是一个简单的例子来说明我的问题。 我希望 current = 3 返回“之前”。 current = 4 应该返回“key-two”,current = 5 应该返回“
有人能告诉我为什么这会返回 true 吗?我想如果我投一些东西给例如Object 然后调用.equals,将使用 Object 的默认实现。 s1 == s2 应该返回 false。 请告诉我在哪个主
我需要检查加载到 UIImage 对象文件中的文件是否等于另一个图像,如果是,则执行一些操作。不幸的是,它不起作用。 emptyImage = UIImage(named: imageName) if
我想知道什么是正确的 Java 编程范式来覆盖类 C 对象的 equals(和 hashCode)方法,在以下情况下 (a) 有没有足够的信息来确定 C 的两个实例是否相等,或者 (b) 调用方法不应
>>> (()) == () True >>> (()) () 最佳答案 () 是一个 0 元组。 (foo) 产生 foo 的值。因此,(()) 产生一个 0 元组。 来自 the tutorial
考虑这段代码: var i = 0; >> undefined i += i + i++; >> 0 i >> 0 // why not 1? 由于增量 (++) 运算符,我希望 i 为 1。我认为
在我看来,TValue 似乎缺少一个强制方法; TValue.Equals(TValue)。 那么比较 2 个 TValue 的快速且合适的方法是什么,最好不使用 TValue.ToString(),
使用 SQL 时,在 WHERE 子句中使用 = 代替 LIKE 有什么好处吗? 如果没有任何特殊的运算符,LIKE 和 = 是相同的,对吧? 最佳答案 不同的运算符 LIKE 和 = 是不同的运算符
我是一名优秀的程序员,十分优秀!