我的问题:
我想从一个Thread运行一个方法,这个方法没有Thread但可能需要一些时间来执行(例如,等待服务器响应)。重要的是我的无线程方法在另一个类中(类也是在其他类中使用的对象)。
如果你在示例代码中执行此操作,整个程序将暂停10秒,但我希望它继续使用其他程序代码。
这样做有好办法吗?
我的代码:
MyThread.java (extends Thread
)
public Foo foo;
public void run() {
foo.bar();
}
Foo.java
public void bar() {
try {
Thread.sleep(10000);
// Represents other code that takes some time to execute
// (e.g. waiting for server response)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
以及主方法:
public static void main(String[] args) {
MyThread t = new MyThread();
t.foo = new Foo();
System.out.println("Starting!");
t.run();
System.out.println("Done!");
}
答案 0 :(得分:4)
您不想在线程上呼叫run()
,您想呼叫start()
。
答案 1 :(得分:2)
假设MyThread
延长Thread
,您需要致电start()
而不是run()
。
调用run()
只是同步调用方法。
public static void main(String[] args) {
MyThread t = new MyThread();
t.foo = new Foo();
System.out.println("Starting!");
t.start(); // change here
System.out.println("Done!");
}
start()
实际上启动了一个OS线程来运行你的代码。
答案 2 :(得分:0)
在你的线程上使用start()而不是run()。或者它就像主线程调用另一个线程的方法,这意味着你在主线程本身上调用wait()。
答案 3 :(得分:0)
不要直接调用run()方法。
调用start()方法而不是run()方法。
直接调用run()方法
这个帖子转到主堆栈,它一个接一个地运行。
答案 4 :(得分:0)
class MyThread extends Thread{
public Foo foo;
public void run() {
foo.bar();
}
}
class Foo{
public void bar() {
try {
boolean responseCompleted = false;
boolean oneTimeExcution = false;
while(!responseCompleted){
if(!oneTimeExcution){
// Represents other code that takes some time to execute
oneTimeExcution = true;
}
if( your server response completed){
responseCompleted = true;
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MyThread t = new MyThread();
System.out.println("Starting!");
t.start();
System.out.println("Done!");
}