java可视化模拟进程的并发执行
- 模拟内容
- 附录程序清单
- 效果展示
模拟内容
利用JAVA语言,模拟进程的并发执行的过程。一是体现在单CPU环境下,对CPU的竞争;二是体现在无明确调度算法支撑下,进程调度运行的无序性;三是充分体现推进过程的异步性;四是充分体现并发执行进程的微观表现。
附录程序清单
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ThreadProcess {
public static void main(String []arg) {
ThreadFrame threadFrame=new ThreadFrame();
threadFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//框架关闭时退出程序
Ball1 ball1=new Ball1(Panel1.b1,ThreadFrame.panel1);
Ball2 ball2=new Ball2(Panel2.b2,ThreadFrame.panel2);
Ball3 ball3=new Ball3(Panel3.b3,ThreadFrame.panel3);
int i=0;
int j=0;
int[] array=new int[1000];
for(i=0;i<1000;i++) {
j=(int)(Math.random()*10%3);
array[i]=j;
//j=i;
//array[i]=j%3;
}
while (true) {
for(i=0;i<1000;i++) {
switch (array[i]) {
case 0:
if(ball1.flag==true) {
ball1.run();
}
else {
ball1.yield();
}
break;
case 1:
if(ball2.flag==true) {
ball2.run();
}
else {
ball2.yield();
}
break;
case 2:
if(ball3.flag==true) {
ball3.run();
}
else {
ball3.yield();
}
break;
default: break;
}
}
}
}
}
class ThreadFrame extends JFrame {
public static Panel1 panel1=new Panel1();
public static Panel2 panel2=new Panel2();
public static Panel3 panel3=new Panel3();
public static Panel4 panel4=new Panel4();
public ThreadFrame() {
super("模拟进程的并发执行");
setSize(850,500);
setLocationRelativeTo(null);//把窗口位置设置到屏幕中心
Container container=this.getContentPane();
GridLayout gridLayout=new GridLayout(4,1);
container.setLayout(gridLayout);
container.add(panel4);
container.add(panel1);
container.add(panel2);
container.add(panel3);
setVisible(true);
}
}
class Panel1 extends JPanel {
JButton b_start1;
//JButton b_stop1;
public static ball b1;
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.orange);
g.fillOval(b1.x,b1.y,60,60);
}
public Panel1() {
setLayout(null);
setBorder(BorderFactory.createTitledBorder("模拟进程1"));
b_start1=new JButton("暂停");
//b_stop1=new JButton("暂停");
b_start1.setBounds(730,50,70,35);
//b_stop1.setBounds(730,50,70,35);
add(b_start1);
//add(b_stop1);
b1=new ball(50,35);
b_start1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
//Ball1.flag=true;
//Panel4.label2.setText("模拟进程1正在执行");
if(Ball1.flag==true)
{
Ball1.flag=false;
b_start1.setText("执行");
Panel4.label2.setText("模拟进程1已暂停");
}
else
{
Ball1.flag=true;
b_start1.setText("暂停");
Panel4.label2.setText("模拟进行1正在执行");
}
}
});
/*b_stop1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
Ball1.flag=false;
Panel4.label2.setText("模拟进行1已暂停");
}
});*/
}
}
class Panel2 extends JPanel {
JButton b_start2;
//JButton b_stop2;
public static ball b2;
public Panel2() {
setLayout(null);
setBorder(BorderFactory.createTitledBorder("模拟进程2"));
b_start2=new JButton("暂停");
//b_stop2=new JButton("暂停");
b_start2.setBounds(730,50,70,35);
//b_stop2.setBounds(730,50,70,35);
add(b_start2);
//add(b_stop2);
b2=new ball(50,35);
b_start2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
if(Ball2.flag==true) {
Ball2.flag=false;
b_start2.setText("执行");
Panel4.label3.setText("模拟进程1已暂停");
}
else {
Ball2.flag=true;
b_start2.setText("暂停");
Panel4.label3.setText("模拟进行1正在执行");
}
}
});
/*b_stop2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
Ball2.flag=false;
Panel4.label3.setText("模拟进程2已暂停");
}
});*/
}
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.GREEN);
g.fillOval(b2.getX(),b2.getY(),60,60);
}
}
class Panel3 extends JPanel {
JButton b_start3;
//JButton b_stop3;
public static ball b3;
public Panel3() {
setLayout(null);
setBorder(BorderFactory.createTitledBorder("模拟进程3"));
b_start3 = new JButton("暂停");
//b_stop3 = new JButton("暂停");
b_start3.setBounds(730, 50, 70, 35);
//b_stop3.setBounds(730, 50, 70, 35);
add(b_start3);
//add(b_stop3);
b3=new ball(50,35);
b_start3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
if(Ball3.flag==true) {
Ball3.flag=false;
b_start3.setText("执行");
Panel4.label4.setText("模拟进程1已暂停");
}
else {
Ball3.flag=true;
b_start3.setText("暂停");
Panel4.label4.setText("模拟进行1正在执行");
}
}
});
/*b_stop3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
Ball3.flag = false;
Panel4.label4.setText("模拟进程3已暂停");
}
});*/
}
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.blue);
g.fillOval(b3.getX(),b3.getY(), 60, 60);
}
}
class Panel4 extends JPanel {
public static JLabel label2=new JLabel("模拟进程1正在执行");
public static JLabel label3=new JLabel("模拟进程2正在执行");
public static JLabel label4=new JLabel("模拟进程3正在执行");
public static JLabel label5=new JLabel("进程并发执行过程演示");
public Panel4() {
setLayout(null);
Font f=new Font("宋体",Font.PLAIN,30);
label5.setFont(f);
label5.setBounds(250,10,500,50);
label2.setBounds(250,60,150,25);
label3.setBounds(450,60,150,25);
label4.setBounds(650,60,150,25);
label2.setBorder(BorderFactory.createLoweredBevelBorder());
label3.setBorder(BorderFactory.createLoweredBevelBorder());
label4.setBorder(BorderFactory.createLoweredBevelBorder());
add(label5);
add(label2);
add(label3);
add(label4);
}
}
class Ball1 extends Thread {
public static boolean flag=true;
public Panel1 panel1;
public ball b;
public Ball1(ball b,Panel1 panel1) {
this.b=b;
this.panel1=panel1;
}
@Override
public void run() {
if(b.x<650) {
b.x+=10;
panel1.repaint();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else {
b.x=50;
}
}
}
class Ball2 extends Thread {
public static boolean flag=true;
public Panel2 panel2;
public ball b;
public Ball2(ball b,Panel2 panel2) {
this.b=b;
this.panel2=panel2;
}
@Override
public void run() {
if(b.x<650) {
b.x+=10;
panel2.repaint();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else {
b.x=50;
}
}
}
class Ball3 extends Thread {
public static boolean flag=true;
public Panel3 panel3;
public ball b;
public Ball3(ball b,Panel3 panel3) {
this.b=b;
this.panel3=panel3;
}
public void run() {
if(b.x<650) {
b.x+=10;
panel3.repaint();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else {
b.x=50;
}
}
}
class ball {
public int x;
public int y;
public ball(int x,int y) {
this.x=x;
this.y=y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
效果展示
通过按钮来控制小球的运动,观察小球运动速度的变化。