在一个计算机中时刻运行着许多程序,那么计算机是如何处理这些程序的呢,我们今天来简单分析一下。
一个程序的运行我们将它叫做进程,而一个进程中包含着许多的线程,电脑通过运行这些线程从而实现我们想要的东西。这里我们提出一个概念,并行和并发。我们可以简单理解为并行就是在同一个时间内同时进行的线程个数,而并发就是在一个时间点同时发生的线程个数。
今天我们通过一个简单案例来上手线程,实现的效果是用鼠标点击一个位置那么就会产生一个定向移动的小球。大概的思路是在一个界面上将每一个小球的运动看作一个线程,那么每点击一次就会产生一个线程。
下面进行第一步,写一个界面,利用构造函数的方法初始化窗体基本参数。
public UIball(){
this.setTitle("小球发射器");
this.setSize(1000,1000);
this.setDefaultCloseOperation(3);
this.setLayout(null);
this.getContentPane().setVisible(false);
this.setBackground(Color.white);
this.setVisible(true);
}
好,那么接下来我们想要实现画出一个小球,就要添加一个鼠标监听器,这里我们采用继承MouseAdapter的方法来写我们的监听器,目的是简化代码,只需重写我们需要的方法,这里是click方法。
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class ThreadListener extends MouseAdapter {
Graphics g;
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
}
}
然后我们写实现画小球的线程,这里我们用了一个延时功能来画出小球定向移动的效果:
package ArrayLIst;
import java.awt.*;
public class Threadball extends Thread{
int x;
int y;
Graphics g;
public Threadball(int x, int y, Graphics g){
this.x=x;
this.y=y;
this.g=g;
}
@Override
public void run() {
super.run();
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
y+=3;
g.setColor(Color.white);
g.fillOval(x,y-3,50,50);
g.setColor(Color.black);
g.fillOval(x,y,50,50);
}
}
}
值得注意的是,我们加了一个while(true)的一个死循环,作用是使得这个线程可以进行下去不停止。
那么最后我们就是将他们结合起来使用,通过窗体获取画笔,然后传给我们的鼠标监听器,再将鼠标监听器加在我们的界面上,最后我们想要每点击一次就创建一个线程对象,所以我们在重写方法那里调用线程的方法,但是这里有一个固定格式:
hreadball threadball=new Threadball(e.getX(),e.getY(),g);
threadball.start();
start函数就是调用线程的方法,否则线程将无法实现。
最后补充画笔传递以及添加监听器部分:
Graphics g=this.getGraphics();
threadListener.g=g;
this.addMouseListener(threadListener);