JAVA中多线程中遇到的问题

问题描述

有3个类1:MyFrame:import java.awt.event.ActionEvent;public class MyFrame extends javax.swing.JFrame {private java.awt.Graphics g;private int x, y;private java.util.Random rand = new java.util.Random();public static MyThread mt;public static MyFrame mf = new MyFrame();public static int num = 3;public void init() {this.setTitle("线程的暂停与继续");this.setSize(700, 700);this.setLayout(new java.awt.FlowLayout());// 添加开始按钮final javax.swing.JButton bu = new javax.swing.JButton("开始");this.add(bu);final javax.swing.JButton bu2 = new javax.swing.JButton("暂停");this.add(bu2);// 添加进度条final javax.swing.JProgressBar probar = new javax.swing.JProgressBar();this.add(probar);this.setDefaultCloseOperation(3);this.setLocationRelativeTo(null);this.setVisible(true);g = this.getGraphics();// 按钮1bu.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(ActionEvent e) {mt = new MyThread(probar);String str = new String();if ("开始".equals(e.getActionCommand())) {for (int i = 0; i < num; i++) {x = rand.nextInt(500) + 100;y = rand.nextInt(500) + 100;BallThread bt = new BallThread(mf, g, x, y);bt.start();}mt.start();bu.setText("停止");}if ("停止".equals(e.getActionCommand())) {mt.stopThread();bu.setText("重新开始");bu2.setText("暂停");}if ("重新开始".equals(e.getActionCommand())) {mt.restart();mt.start();for (int i = 0; i < num; i++) {x = rand.nextInt(500) + 100;y = rand.nextInt(500) + 100;BallThread bt = new BallThread(mf, g, x, y);bt.start();}bu.setText("停止");}}});// 按钮2bu2.addActionListener(new java.awt.event.ActionListener() {public void actionPerformed(ActionEvent e) {String str = new String();if ("暂停".equals(e.getActionCommand())) {mt.pauseThread();bu2.setText("继续");}if ("继续".equals(e.getActionCommand())) {mt.continueThread();bu2.setText("暂停");}}});}public static void main(String args[]) {MyFrame mf = new MyFrame();mf.init();}}2.MyThread:public class MyThread extends Thread {public static boolean isFinish = false;// 是否停止public static boolean isPause = false;// 是否暂停private javax.swing.JProgressBar probar;private int value = 0;public MyThread(javax.swing.JProgressBar probar) {this.probar = probar;}public void run() {this.changeValue();}public void changeValue() {while (!isFinish) {// System.out.println("暂停中");while (!isPause) {// System.out.println("运行中");probar.setValue(value);value++;try {Thread.sleep(100);} catch (Exception ef) {ef.printStackTrace();}}try {Thread.sleep(100);} catch (Exception ef) {ef.printStackTrace();}}// System.out.println("结束了");}public void stopThread() {isPause = true;isFinish = true;}public void continueThread() {isPause = false;}public void pauseThread() {isPause = true;}public void restart() {value = 0;isPause = false;isFinish = false;}}3.BallThread:public class BallThread extends Thread {private java.awt.Graphics g;private int x = 20, y = 20;private MyFrame mf = MyFrame.mf;private java.util.Random rand = new java.util.Random();public static int xx[] = new int[30];public static int yy[] = new int[30];public BallThread(MyFrame mf, java.awt.Graphics g, int x, int y) {this.mf = MyFrame.mf;this.g = g;this.x = x;this.y = y;}public BallThread(int x,int y) {this.x = x;this.y = y;}public void run() {changBall();}public synchronized void changBall() {while (!MyThread.isFinish) {//System.out.println("运行了");while (!MyThread.isPause) {//System.out.println("运行了");g.setColor(mf.getBackground());g.fillOval(x, y, 20, 20);x += 20;y += 20;g.setColor(java.awt.Color.BLUE);g.fillOval(x, y, 20, 20);try {Thread.sleep(100);} catch (Exception ef) {ef.printStackTrace();}}}if(MyThread.isFinish) {g.setColor(mf.getBackground());g.fillOval(x, y, 20, 20);}}public int getX() {return this.x;}public int getY() {return this.y;}}若将MyFrame中的num设置为3,则重复执行开始、停止、重新开始,可能会出现球擦不干净的情况,若num设置为1,则每次运行球都擦得干净。不知道是什么原因,期待高手讲解。 问题补充:cuiran 写道

解决方案

你的程序调用的时候是,每次生成一个 BallThread bt = new BallThread(mf, g, x, y); bt.start(); 然后就开始运行,这样在运行的过程中就容易出错,你可以先产生对象然后在运行.
解决方案二:

你num为3就相当于创建了3个BallThread的线程,创建了3个球的运行.但你在做 g.setColor(mf.getBackground()); g.fillOval(x, y, 20, 20); 当球走完后对之前的进行擦除时候,此时已经乱了,因为此时的x,y值它不知道是哪一个球的x,y.你可以写个bean.里面包含ball的num和对应的x,y值,然后在画ball的下个轨迹的时候用变量对其之前的进行保存,这样就对变量中的x,y值进行擦除.思路是这样,我现在还在修改你的代码.

时间: 2024-09-16 23:48:11

JAVA中多线程中遇到的问题的相关文章

求mfc中多线程中通过CLIST传值的用法。。

问题描述 求mfc中多线程中通过CLIST传值的用法.. 自己在编一个mfc多线程程序. 如T1想把数据放到一个队列中 T2从这个队列中读取数据,处理数据后把数据保存到队列2中 T3再从队列2中读取数据使用 求帮忙,想实现这个功能是创建队列好还是用clist好.最好有代码实例.谢谢

java join-java多线程中的join问题

问题描述 java多线程中的join问题 各位大神,本人java小菜鸟.学习java遇到一点问题,下面的代码中,已经使用了join方法,为什么显示的结果不是1000呢?请前辈指教! public class JoinThread extends Thread { public static volatile int n=0; public void run(){ for(int i=0;i<10;i++,n++){ try{ sleep(2); }catch(Exception e){} } }

java向多线程中传递参数的三种方法详细介绍_java

在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果.但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别.由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据.本文就以上原因介绍了几种用于向线程传递数据的方法,在下一篇文章中将介绍从线程中返回数据的方法. 欲先取之,必先予之.一般在使用线程时都需要有一些初始化数据,然后线程利用这些数据进行加工处理,并

关于java多线程中的join方法

问题描述 关于java多线程中的join方法 1.主线程可能在子线程结束之前 结束吗?如果可能的话 举一个例子 2.如何理解join方法, 结合实际应用. 非常感谢非常感谢!!! 解决方案 关于join,参考:http://www.blogjava.net/jnbzwm/articles/330549.html 解决方案二: 主线程可能在子线程结束之前 结束吗 一般来说不可以,但是也不一定,如果子线程在执行finally中的代码,应该会等它执行完了才退出. 晕,join方法和什么"让主线程等子线

Java多线程中的两个问题

多线程|问题 多线程中Thread.stop()被废弃的原因:当调用Thread.stop()方法时,该线程将释放先前其控制的所有资源,而在线程没有正常执行完毕之前强迫Stop之后,这些资源可能处在一种不一致的状态,而这些处于不一致的状态的资源被其他的线程所使用之后,就可能会发生一些意想不到的错误.实现时间差事件的解决办法:在主线程中设置一个状态变量,在响应线程执行时,先sleep()一个固定的时间段,之后检查主线程的这个状态,如果这个状态不同就执行不同的操作,或停止执行.可以通过回调机制来实现

Java Web项目中使用Socket通信多线程、长连接的方法_java

很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接如一个硬件设备,通过tcp通信,获取设备传上来的数据,并对数据做回应. 先看一下web的监听代码: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class

锁-JAVA中多线程读取成员变量的重复问题

问题描述 JAVA中多线程读取成员变量的重复问题 这是个模拟卖票的问题,使用一个对象实现Runnable接口建立四个线程,这个对象有100张票,四个进程同时卖,因为没使用锁,所以会出现负数票,但是为什么会出现相同的票呢?8号票卖了四次,是因为成员变量在if之后进栈保存了值?然后直接用这个num输出吗? 代码: class Ticket implements Runnable//extends Thread { private int num = 100 public void run()//这时

多线程问题-新手求助关于Java多线程中启动线程问题

问题描述 新手求助关于Java多线程中启动线程问题 public class Example15_1 { /** * @param args */public static void main(String[] args) { // TODO Auto-generated method stub SpeakHello speakHello; SpeakNinhao speakNinhao; speakHello = new SpeakHello(); speakNinhao= new Speak

java中多线程下静态connection的问题

问题描述 java中多线程下静态connection的问题 普遍观点是不要使用静态的连接,但是--我面临的需求情况是1.数据只查不改2.该连接只在用户登陆时使用,而其他过程有单独的连接池(与登录不是一个库),用池觉得浪费3.可能在同一时间有几千人同时登陆,而一天内的其他时间登录次数很少.以下是部分代码: public class CWJdbcConnection { private static Map<String String> map = new GetFile().getFile(Fc