public class Job extends Thread{
int a =0;
public void run() {
for(int i =0;i<100;i++){
a = i;
}
}
public int getInt(){
        return a;
}}在建立这个线程的时候,用getInt()的方法获得的a总是0,请问如何才能获得的是99?我的想法是,把一部分的工作交给一个线程去跑,等它跑完了,会返回给我一个数据!

解决方案 »

  1.   

    public class Job extends Thread{
    int a =0;
    boolean canGeta = false;
    public void run() {
            for(int i =0;i<100;i++){
                a = i;
            }
            canGeta = true;
            setInt(a);
        }
    public int getInt(){
            return a;
    }public void setInt(int a){
            this.a = a;
    }}
    当canGeta是true的时候才能去geta,当然用swingworker的机制更好
      

  2.   

    看下API里的:java.util.concurrent.Future
    也许对你有帮助!Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。用法示例(注意,下列各类都是构造好的。) interface ArchiveSearcher { String search(String target); }
     class App {
       ExecutorService executor = ...
       ArchiveSearcher searcher = ...
       void showSearch(final String target)
           throws InterruptedException {
         Future<String> future
           = executor.submit(new Callable<String>() {
             public String call() {
                 return searcher.search(target);
             }});
         displayOtherThings(); // do other things while searching
         try {
           displayText(future.get()); // use future
         } catch (ExecutionException ex) { cleanup(); return; }
       }
     }
     FutureTask 类是 Future 的一个实现,Future 可实现 Runnable,所以可通过 Executor 来执行。例如,可用下列内容替换上面带有 submit 的构造:     FutureTask<String> future =
           new FutureTask<String>(new Callable<String>() {
             public String call() {
               return searcher.search(target);
           }});
         executor.execute(future);
      

  3.   

    public class Job extends Thread {
    int a = 0; public void run() {
    for (int i = 0; i < 1000000; i++) {
    a = i;
    }
    getA(); } public int getA() {
    System.out.println(a);
    return a; } public void setA(int a) {
    this.a = a;
    } public static void main(String[] args) throws InterruptedException {
    Job job = new Job();
    Thread sThread = (Thread) job;
    sThread.start();
    sThread.sleep(10);//此处让线程睡眠几毫秒
    job.getA();//这是对象中的a,既线程睡眠时a循环到的值。你总是返回0是由于你get的时候线程已经死掉,执行完毕了,要得到线程循环的值你在run 方法内部去get或者让线程先睡眠一会你去get。
      

  4.   

    1,把结果付给Thread或者Runable的成员变量,启动线程后不断的检测成员变量的值.
    2,用java.util.concurrent.Future 
      

  5.   

    感谢。虽然看不懂Future ,不过也学到了新知识,谢谢几位老师
      

  6.   

    public class GetVALUE implements Runnable{ private int a;
    public void run() {
    for(int i = 0;i<20;i++){
    a = i;
    System.out.println(a);
    }
    }
    public int getValue(){
    return a;
    }
    public static void main(String[] args) {
    GetVALUE value = new GetVALUE();
    Thread thread = new Thread(value);
    thread.start();
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    System.out.println(value.getValue());
    }
    }