- 程序 program:用语言编写的一组指令,一段静态的代码。
- 进程 process: 正在执行中的程序。
- 线程 thread:进程可细分为多个线程,一条执行路径。每一个线程都有独立的栈和程序计数器pc。 多个线程共用同一个进程中的结构(方法区和堆)。
- 单核CPU: 同一时间内只能执行一个线程,只不过是在快速切换,所以是假的多线程。
- 多核CPU:同一时间内执行多个线程。
- eg: java.exe是多线程,至少有main()主线程、gc()垃圾回收线程、异常处理线程。
- 并行:一个CPU同时执行多个任务。
- 并发:多个CPU同时执行多个任务。
第一种方法:用extends去继承thread 第二种方法:用runnable去创建接口
以多个运动的小球为例 1.创建界面 BallUI 所用技巧:创建窗体(名称、大小、居中显示)、设置必要的组件(创建监听器并让其得到画笔、把鼠标监听器放到窗体中)public class BallUI {
public void initUI(){
JFrame jf = new JFrame();
jf.setTitle("并发线程");
jf.setSize(1000,1000);
//居中显示
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
//给窗体添加鼠标监听器
ThreadListener listener = new ThreadListener(jf.getGraphics());
jf.addMouseListener(listener);
}
public static void main (String[] args){
BallUI ui = new BallUI();
ui.initUI();
System.out.println("main : "+Thread.currentThread().getName());
}
}
2.创建ThreadBallExtend 用extends继承Thread
//创建线程的第一种方法:继承 extends Thread
public class ThreadBallExtend extends Thread{
private int x,y;
private Graphics g;
//初始化属性
public ThreadBallExtend (int x, int y, Graphics g){
this.x = x;
this.y = y;
this.g = g;
}
//run方法
public void run(){
while(true){
System.out.println(this.getName()+"正在运行...");
try{
ThreadBallExtend.sleep(100);}
catch (InterruptedException interruptedException){interruptedException.printStackTrace();
}
//绘制小球
g.fillOval(x++,y++,60,60);
}
}
}
3.创建ThreadListenerRunnable 用runnable去创建接口 implements
通过implements声明自己使用一个或者多个接口,但必须用override重写才能使用
运用run方法使线程处于就绪状态,设置睡眠时间,时间结束后自动释放
public class ThreadListenerRunnable implements Runnable {
//定义线程类
private int x,y;
private Graphics g;
//初始化属性
public ThreadListenerRunnable(int x, int y, Graphics g){
this.x = x;
this.y = y;
this.g = g;
}
//启动线程后自动执行的方法
//run 方法执行完该线程结束,该对象的所有内存,数据被释放
public void run(){
while(true) {
System.out.println(Thread.currentThread().getName()+":RUNNABLE 正在运行...");
try {
Thread.sleep(100);
} catch (Exception interruptedException) {
interruptedException.printStackTrace();
}
//绘制运动的小球对象
g.fillOval(x++, y++, 50, 50);
}
}
}
4.创建监听器 ThreadListener
因为只需要用到鼠标点击功能,所以用override重写,使鼠标监听器点击时得到画笔及其坐标x,y
当鼠标点击时,启动两种方式建立的线程,可以先注释掉一种方式,执行另一种方式。
此处注释掉了extend的方式,运用runnable接口的方式
//事件处理类
public class ThreadListener extends MouseAdapter {
private Graphics g; //画笔对象
//定义set方法,初始化属性
//构造方法初始化属性
public ThreadListener(Graphics g){
this.g = g;
}
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
//第一种方法:创建线程对象
//ThreadBallExtend tb = new ThreadBallExtend(x,y,g);
//启动线程:调用Thread类中的start方法
//每个线程对象只能启动一次
//tb.start();
//第二种方法:实现Runnable 接口
ThreadListenerRunnable runnable = new ThreadListenerRunnable(x,y,g);
Thread t = new Thread(runnable);
t.start();
}
}
执行后,鼠标点击屏幕出现此效果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)