首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java线程-同步线程

Java线程-同步线程
EN

Stack Overflow用户
提问于 2016-05-05 02:58:45
回答 1查看 226关注 0票数 1

我有这样的东西:

代码语言:javascript
复制
 enter code here

public class Main {

public static void main(String[] args) throws InterruptedException {
    StringTask task = new StringTask("A", 100000);
    System.out.println("Task " + task.getState());
    task.start();
    if (args.length > 0 && args[0].equals("abort")) {

        Thread t = new Thread(() -> {
            Thread.currentThread();
            try {
                Thread.sleep(1000);
                task.abort();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        });
        t.start();
    }
    while (!task.isDone()) {
        Thread.sleep(500);
        switch (task.getState()) {
        case "RUNNING":
            System.out.print("R.");
            break;
        case "ABORTED":
            System.out.println(" ... aborted.");
            break;
        case "READY":
            System.out.println(" ... ready.");
            break;
        default:
            System.out.println("uknown state");
        }

    }
    System.out.println("Task " + task.getState());
    System.out.println(task.getResult().length());
}

}

class StringTask implements Runnable {
private String word;

private int nr;
private boolean stopThread = false;
private String result = "";
private String state = "";
private boolean done = false;
private boolean end = false;
public Thread thread;

public StringTask(String s, int n) {
    this.word = s;
    this.nr = n;
    this.state = "CREATED";
}

public void STOP() {
    this.stopThread = true;
}

public void run() {
    this.state = "RUNNING";
        try {
            for (int i = 0; i < nr; i++) {
                result += word;
            }
            this.state = "READY";
            this.done = true;
        } catch (Exception e) {
            this.state = "ABORTED";
            this.done = false;

        }

    }

public synchronized void start() {
    thread = new Thread(this);
    thread.start();
}

public synchronized void abort() throws Exception {
    thread.interrupt();
    this.end = true;
    this.done = true;
    this.state = "ABORTED";

}

public String getResult() {
    return this.result;
}

public String getState() {

    return this.state;
}

public boolean isDone() {
    return this.done;
}
 }

所以,如果我运行不带参数程序(我的意思是字符串args[]),程序可以正常运行,但是如果我设置了agument = abort

我的程序应该打印类似下面这样的内容:

任务已创建R....已中止。任务已中止31700

有时他打印得很好,但有时他打印的东西是这样的:

任务已创建R.R.Task已中止58891

大概是这样的:

任务已创建R.R. ...准备好的。任务就绪70000

但我不知道为什么,所以我的问题是:

如何正确地同步线程,这样它们才能做它们应该做的事情?

EN

回答 1

Stack Overflow用户

发布于 2016-05-05 03:21:10

没有任何有意义的共享状态(设置了一些标志,读取它们的代码不同步,因此它们可能没有获得更新值,但这些字段似乎没有被使用),所以同步在这里不是问题。

您的任务的run方法不处理中断(例如,它不检查Thread.currentThread().isInterrupted()),因此调用interrupt没有任何效果。中断要求被中断的任务通过检查是否被中断并采取措施结束自身来进行协作。您可以更改循环以测试中断,如下所示:

代码语言:javascript
复制
       for (int i = 0; i < nr; i++) {
            result += word;
            if (Thread.currentThread().isInterrupted()) {
                break;
            }
        }

您有一个将字符连接到字符串的线程,它占用多少CPU时间取决于操作系统,它必须决定在这里为每个线程分配多少时间,以及在您的计算机上执行其他进程时为JVM分配多少时间。有时你的任务可能会在线程试图中断它之前完成,而另一些时候可能不会,这会影响打印输出的状态。当您重复运行它时,您应该期望得到不同的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37035840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档