我想在显示“加载动画文本”时加载一些文件。
我用一个线程加载文件,用我的主线程显示动画。
问题是在一些测试中,我注意到我的线程使用的工作时间有时不好以至于我的动画真的被卡住了.
代码示例:这是一个示例,我的代码太长了,但这是我加载文件的代码的主要形式:
for (int i = 0; i < file.size; i++) {
//Do soem stuff
}
示例:(A = 加载文件线程;B = 文本动画)
A
B
B
B
B
B
A
A
A
A
A
我想要什么:
A
B
A
A
B
B
A
A
B
A
B
A
B
A
我的问题是:有没有办法让线程更同时工作?
编辑:
我的代码太长(超过 500 行),但使用简单的代码我得到了同样糟糕的结果:
例子
package thread_test;
public class TestThread extends Thread {
public TestThread(String name) {
super(name);
}
public void run() {
for(int i = 0; i < 30; i++)
System.out.println(this.getName());
}
}
主类
package thread_test;
public class Test {
public static void main(String[] args) {
TestThread t = new TestThread("A");
TestThread t2 = new TestThread(" B");
t.start();
t2.start();
}
}
结果:
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
如您所见,我遇到了同样的问题,所以如果我们能用给定的代码解决这个问题,我想我也能解决我的问题。
最佳答案
当谈到线程调度时,Java 几乎无法保证:例如,无法保证从线程池中选择线程运行的顺序。
你无法控制调度器,但你可以影响它,例如通过使用
- Thread.yield()提示调度程序“让其他线程做一些工作”
- Thread.sleep(long)让当前线程至少 hibernate 指定的时间
- 使用Thread.setPriority(int)设置不同的线程优先级(但请记住,JVM 不保证线程调度优先级行为)
- 或者您使用 Thread.join() 对您的线程实现更严格的生命周期控制, 同步, Object.wait()和 Object.notify()/Object.notifyAll()
如果线程生命周期如您所描述的那样(即两个线程获得相同的时间但应该更频繁地切换),请尝试添加一些 Thread.yield()到两个线程。
但在大多数情况下,当调度器做奇怪事情时,问题是有一个线程几乎占用了所有 cpu 时间。
关于Java线程工作频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30892878/