多线程暂停和控制(通过按钮控制暂停的4个小球)

本文介绍了一个Java多线程应用案例,通过按钮控制四个线程中的小球运动状态,实现暂停与继续的功能。利用布尔变量控制线程中图形的绘制与暂停,并通过监听器响应按钮事件来改变线程的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.
任务:通过按钮控制暂停的4个小球;按一次按钮就改变一次状态。
方法说明:在按钮事件里控制线程对象的状态,调用对象的方法改变其状态。

二.思路与源代码:

基本思路:设置一个bool值控制线程里的画图部分,为真则继续画,为假就休眠(时间设短点即可,每隔一段时间就会再检查一次bool的值)。在休眠时让i递减,这样再开始时小球就会从原位置开始。

在主函数内开启4个线程。加一个按钮,给按钮加动作监听器。把4个线程传入监听器。在线程中创建一个公有方法改变线程的属性BOOL值,在监听器中调用,按一次按钮就改变一次。即可完成控制。

PS:小球的绘制在上篇中的程序的基础上修改。

源代码:
[/code]

主函数:
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ball3 extends JFrame{
boolean go=true;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ball3 b=new ball3();
b.InitGUI();
}

private void InitGUI() {
// TODO Auto-generated method stub
this.setTitle("球");
this.setSize(new Dimension(600,600));
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.setResizable(false);
this.setVisible(true);
Graphics g=this.getGraphics();
JPanel JP=new JPanel();
JButton BU=new JButton("PUSH");
this.add(JP);
JP.add(BU);
//创建4个线程,开启它们
Printthred3 l=new Printthred3(g,1,go);
l.start();
Printthred3 l2=new Printthred3(g,2,go);
l2.start();
Printthred3 l3=new Printthred3(g,3,go);
l3.start();
Printthred3 l4=new Printthred3(g,4,go);
l4.start();
//给鼠标加监听器,传入4个线程
BUAction3 ll=new BUAction3(g,go,l,l2,l3,l4);
BU.addActionListener(ll);
}

}
[code="java"]


线程类Printthred3:
import java.awt.Color;
import java.awt.Graphics;
/**
* 线程类
* @author IRISL
*
*/
public class Printthred3 extends Thread{

int ii=0,jj=0,c1=0,c2=0,c3=0,c4=0;
boolean go;
private Graphics g;
private int type;

//构造方法,传入画布,类型和布尔值
public Printthred3(Graphics g,int type,boolean go){
this.g=g;
this.type=type;
this.go=go;
}

//RUN函数
public void run(){
if(type==1)draw1();
if(type==2)draw2();
if(type==3)draw3();
if(type==4)draw4();
}
public void changego(){
go=!go;

}



//从左上角出现的球
public void draw1(){
for (int i=0;i<100000;i++){
if(this.go){

c1=c1+1;
g.setColor(new Color((100),(200),(c1)%256));
if(i>=300){
g.clearRect(300-(ii-300),300-(ii-300), 30, 30);
g.fillOval(300-(i-300), 300-(i-300), 30, 30);

}else
{ g.clearRect(ii, jj, 30, 30);
g.fillOval(i, i, 30, 30);

}
try{
Thread.sleep(10);
}catch(Exception ef){}
ii=i;jj=i;
}else{
try{
Thread.sleep(10);
i--;
}catch(Exception ef){}
}
}
}

//从方向2出现的球
public void draw2(){
for (int i=0;i<1000;i++){
if(this.go){
c2=c2+1;
g.setColor(new Color((100),(200),(c2)%256));
if(i>=300){
g.clearRect(ii,300-(ii-300), 30, 30);
g.fillOval(i, 300-(i-300), 30, 30);

}else
{ g.clearRect(ii, 600-jj, 30, 30);
g.fillOval(i, 600-i, 30, 30);

}
try{
Thread.sleep(10);
}catch(Exception ef){}
ii=i;jj=i;
}else{
try{
Thread.sleep(10);
i--;
}catch(Exception ef){}
}
}
}

//从方向3出现的球
public void draw3(){
for (int i=0;i<1000;i++){
if(this.go){
c3=c3+1;
g.setColor(new Color((250),(c3)%256,(250)));
if(i>=300){
g.clearRect(300-(ii-300),ii, 30, 30);
g.fillOval(300-(i-300), i, 30, 30);

}else
{ g.clearRect(600-ii, jj, 30, 30);
g.fillOval(600-i, i, 30, 30);

}
try{
Thread.sleep(10);
}catch(Exception ef){}
ii=i;jj=i;
}else{
try{
Thread.sleep(10);
i--;
}catch(Exception ef){}
}
}
}

//从方向4出现的球
public void draw4(){
for (int i=0;i<1000;i++){
if(this.go){
c4=c4+1;
g.setColor(new Color((250),(c4)%256,(250)));
if(i>=300){
g.clearRect(ii,ii, 30, 30);
g.fillOval(i,i, 30, 30);

}else
{ g.clearRect(600-ii,600-jj, 30, 30);
g.fillOval(600-i, 600-i, 30, 30);

}
try{
Thread.sleep(10);
}catch(Exception ef){}
ii=i;jj=i;
}else{
try{
Thread.sleep(10);
i--;
}catch(Exception ef){}
}
}
}
}

[code="java"][/code]
监听器:
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class BUAction3 implements ActionListener{
private Graphics g;
private boolean go;
private Printthred3 p,p2,p3,p4;
//重新构造方法,传入4个线程
public BUAction3(Graphics g,boolean go,Printthred3 p,Printthred3 p2,Printthred3 p3,Printthred3 p4){
this.g=g;
this.go=go;
this.p=p;
this.p4=p4;
this.p2=p2;
this.p3=p3;
}
//修改线程中的go的值
public void actionPerformed(ActionEvent e) {
p.changego();
p2.changego();
p3.changego();
p4.changego();

}

}

在如何修改线程的BOOL属性上纠结了一下,果然思路要清晰啊。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值