有一个外部程序可以创建XML文件,但创建可能需要一段时间.我需要我的Java程序等到文件存在之后再继续.
我一直在阅读有关同步块的内容,我读到我可以这样做:
synchronized(this) {
while (!file.exists) { this.wait(); }
}
Run Code Online (Sandbox Code Playgroud)
说实话,我对同步任务并不是很了解,所以我想知道我是否在正确的轨道上,或者我是否已经离开了.
什么可以解释持续时间Object.wait(timeout)超过提供的超时值?
long start = System.currentTimeMillis();
obj.wait(1000);
long duration = System.currentTimeMillis() - start;
// sometimes (very rarely) duration may exceed 1500
Run Code Online (Sandbox Code Playgroud)
上下文:在一个非常复杂的软件深处的某个地方,有一段代码可以wait生成这样的代码并在持续时间过长的情况下生成警告日志.在流量高的生产环境中,一些日志会报告巨大的等待(例如30秒).所以我试图重现它,了解可能发生的事情以及如何修复/改进它.
对不起,如果这是非常明显或已在其他地方回答.我找不到任何东西.我有以下代码:
public class SimpleThread extends Thread {
public static Integer sharedVal = 0;
public SimpleThread() {
}
@Override
public void run() {
while(true) {
iterator();
}
}
public void theSleeper() {
System.out.println("Thread: " + this.getId() + " is going to sleep!");
try {
this.sleep(5000);
} catch(Exception e) {
}
}
public void iterator() {
synchronized(sharedVal) {
System.out.println("Iterating sharedVal in thread: " + this.getId());
sharedVal++;
System.out.println(sharedVal);
theSleeper();
System.out.println("Thread : " + getId() + " is done sleeping, trying to iterate again..."); …Run Code Online (Sandbox Code Playgroud) 我想知道操作系统中的任务调度程序如何处理休眠线程.
我的意思是,调度程序是否仍然检查休眠线程,或者在确定哪个线程在接下来的10毫秒内处于活动状态或者给定的时间长时完全跳过.
我之所以这样问,是要弄清楚一个睡眠线程是否会消耗CPU周期(尽管很少).
那么有谁知道会发生什么?
你知道从Windows到Linux有什么不同吗?
我有工作Thread的 Java,我得到下面的错误-我不明白为什么?
码:
import java.util.Random;
public class Test {
public static void main(String[] args) throws InterruptedException {
Vlakno sude = new Vlakno("myName"); // Vlakno = thread class
sude.start();
sude.wait(); // ERROR IS ON THIS LINE
}
}
class Vlakno extends Thread {
private boolean canIRun = true;
private final String name;
Vlakno(String name) {
this.name = name;
}
@Override
public void run() {
while (canIRun) {
// System.out.println("Name: " + name);
}
}
public void mojeStop() { …Run Code Online (Sandbox Code Playgroud) 我还没有工作multithreading,加入和等待有什么区别,通知方法?差异仅限于获取lock和禁止其他人threads访问它或是否有其他用例?
为什么我应该去wait和notify在multithreading何时join可用于完成thread执行?
如果提供了任何实时示例,将会很有帮助
它应该只包含一个循环
while (true) { ... }
我发现它不那么高效,因为它消耗了很多CPU.我希望我的线程能够继续等待,但是最好的方法是让它等待而不消耗这么多CPU?
我有java应用程序,它支持多个工作流程.使用从命令行传递给它的参数选择工作流.在其中一个工作流应用程序需要运行无限时间.我使用以下代码实现了相同的目标
switch (args[0]) {
case "-runForever":
// Some Computation
Thread.sleep(Long.MAX_VALUE);
break;
case "otherCase:
//dosomething
break;
}
Run Code Online (Sandbox Code Playgroud)
这是实现所需功能的好方法吗?
我有运行的线程,我想停止,稍后在恢复.我学会了不使用stop()等,因为这些已被弃用,并且下面的代码似乎成功停止了线程.它只是退出运行方法.现在,我该如何重新启动它?如果我调用start()方法,它说该线程仍在运行,那么在这种情况下会直接调用run()吗?会不会引起任何问题?BTW这适用于Android应用程序,如果这有任何区别.
private volatile stopThread;
public void stopButton() {
// this is called when button is clicked
// and thread is already started and running
stopThread= true;
}
public void run() {
while (!stopThread) {
// do something here
}
stopThread=false;
}
Run Code Online (Sandbox Code Playgroud)
编辑:它是一个在线程启动时启动的计时器,然后可以暂停并重新启动.所以timer是一个包含Thread对象的类(我已经使用SurfaceView扩展了类).
我正在尝试在for循环中启动一个线程.此任务应该只等待一秒钟(Thread.sleep()),因此每次循环重新开始时,都会启动一个新线程,它应该导致线程之后的代码等待它执行.
public void count()
{
for(int i = 29; i>=0; i--)
{
Thread t1;
t1 = new Thread(new TimerClass());
t1.start();
String s = String.valueOf(i);
jLabel6.setText(s);
System.out.println(s);
}
}
public class TimerClass implements Runnable{
@Override
public void run()
{
try{
Thread.sleep(1000);
System.out.println("Timer");
} catch(InterruptedException e)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我在两个方法System.out.println()中实现,以检查它们是否实际执行.我明白了:
29
28
27
26
...//25 - 3
2
1
0
Timer
Timer
Timer
//in all 29 times Timer
Run Code Online (Sandbox Code Playgroud)
所以应该是29,定时器,28,定时器等,但事实并非如此.有谁知道代码有什么问题?非常感谢.
两者都试图做类似的事情,这对线程产生了一些影响.
我知道thread.sleep是让CURRENT线程休眠,等待可以让任何线程等待,如果他们试图获取对象的锁定.
问题是,大部分时间他们都在做类似的事情 - 是什么让你选择一个而不是另一个?
我是java中的多线程的新手.我写了一些类来测试synchronized的函数.我有一些使用synchronized的方法:
public class ShareUtil {
private static Queue<Integer> queue = new LinkedList<Integer>();
public static synchronized void do1(){
System.out.println("do1");
sleep();
}
public static synchronized void do2(){
System.out.println("do2");
sleep();
}
private static void sleep(){
try {
Thread.sleep(1000*50000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可以看到有两种方法使用synchronized,我运行两个线程分别使用这两种方法.
class Run1 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
ShareUtil.do1();
}
}
class Run2 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method …Run Code Online (Sandbox Code Playgroud)