swingworker中的线程同步问题

victorywyf073008 2017-03-09 01:00:38
刚学java的新手,想请教下各位大神,创建了三个swingworker,但是在运行时出现了不同步现象,代码如下,该怎么解决呢?
package exercise132;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.awt.event.ActionEvent;

public class Exercise1 extends JFrame {

private JPanel contentPane;
private final JLabel label = new JLabel("\u7EBF\u7A0B1");
private final JLabel label_1 = new JLabel("\u7EBF\u7A0B2");
private final JTextArea textArea = new JTextArea();
private final JTextArea textArea_1 = new JTextArea();
private final JButton button = new JButton("\u5F00\u59CB\u6E38\u620F");
private final JScrollPane scrollPane = new JScrollPane();
private final JScrollPane scrollPane_1 = new JScrollPane();
private final JTextArea textArea_2 = new JTextArea();
private final JScrollPane scrollPane_2 = new JScrollPane();

/**
* Launch the application.
*/
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Throwable e) {
e.printStackTrace();
}
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Exercise1 frame = new Exercise1();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public Exercise1() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
label.setBounds(93, 13, 36, 18);

contentPane.add(label);
label_1.setBounds(302, 13, 36, 18);

contentPane.add(label_1);
scrollPane.setBounds(14, 45, 125, 155);

contentPane.add(scrollPane);
scrollPane.setViewportView(textArea);
scrollPane_1.setBounds(302, 44, 116, 156);

contentPane.add(scrollPane_1);
scrollPane_1.setViewportView(textArea_1);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Res r = new Res();

WorkerThread wt1 = new WorkerThread(r,textArea);
WorkerThread wt2 = new WorkerThread(r,textArea_1);
WorkerThread wt3 = new WorkerThread(r,textArea_2);

wt1.execute();
wt2.execute();
wt3.execute();
}
});
button.setBounds(159, 213, 113, 27);

contentPane.add(button);
scrollPane_2.setBounds(151, 45, 131, 155);

contentPane.add(scrollPane_2);
scrollPane_2.setViewportView(textArea_2);
}


}



package exercise132;

import java.util.concurrent.ExecutionException;

import javax.swing.JTextArea;
import javax.swing.SwingWorker;

public class WorkerThread extends SwingWorker<StringBuilder,StringBuilder>{
private Res r;
private StringBuilder sb = new StringBuilder();
private JTextArea textArea;

public WorkerThread(Res r,JTextArea textArea) {
this.r = r;
this.textArea = textArea;
}
@Override
protected StringBuilder doInBackground() throws Exception {
// TODO Auto-generated method stub
for(int i = 0;i < 10;i++) {
r.deposit(10);
sb.append(r.getBalance());
sb.append("\n");
//Thread.sleep(10);
}

return sb;
}

public void done() {
try {
StringBuilder sb = get();
textArea.setText(sb.toString());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

class Res {
//private int initial = 100;
private int balance = 100;

public synchronized void deposit(int money) {
balance += money;
}

public int getBalance() {
return balance;
}

}
...全文
99 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

50,533

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧