java中的多线程
首先我们要知道的是何谓线程?线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。而什么是多线程?多线程基本的概念就是同时对多个任务加以控制。
多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。
使用线程的好处有: ·
1)可以把占据长时间的程序中的任务放到后台去处理。 ·
2)用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
3)程序的运行速度可能加快。 ·
4)在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
使用线程的缺处有:
1)如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。
2)更多的线程需要更多的内存空间。
3)线程可能会给程序带来更多“bug”,因此要小心使用。
4)线程的中止需要考虑其对程序运行的影响。
5)通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
除了线程之外还有一个概念是进程,这两者有有何不同呢?
从一定意义上讲,进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行。简单来说:一个应用程序就相当于一个进程,而线程是一个进程内部的多个运行单位。
结束一个线程,进程并不一定会结束,而关闭一个进程则所有线程都会结束。
package 线程入门;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyJFrame {
private JFrame jf;
public static void main(String[] args) {
MyJFrame myjf = new MyJFrame();
myjf.inUnit();
}
/**
* 窗体初始化方法
*/
public void inUnit(){
jf = new JFrame();
jf.setTitle("线程测试");//设置窗体标题
jf.setSize(600,700);//设置窗体大小
//jf.setLocationRelativeTo(null);//设置窗体在正中央显示
jf.setLayout(new FlowLayout());
jf.setDefaultCloseOperation(3);//关闭时程序结束运行
JButton btn = new JButton("ok");
btn.addActionListener(l);
jf.add(btn);
jf.setVisible(true);//设置窗体可见
}
ActionListener l = new ActionListener(){
public void actionPerformed(ActionEvent e) {
MyThread t = new MyThread(jf);
//启动线程
t.start();
}
};
}
package 线程入门;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
/**
* 定义一个MyThread类
* @author Administrator
*
*/
public class MyThread extends Thread{
private JFrame jf ;
private int x,y;
private int vx=1,vy=2;
private int radius = 30;
private Color color;
public MyThread(JFrame jf){
this.jf = jf;
Random r = new Random();
radius = r.nextInt(20)+10;
vx = r.nextInt(10)+1;
vy = r.nextInt(10)+1;
color = new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256));
}
public void run(){
Graphics g = jf.getGraphics();
while(true){
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
//得到窗体的背景颜色
g.setColor(jf.getBackground());
g.fillOval(x, y, radius*2, radius*2);
x+=vx;
y+=vy;
if(x<=0 || x > jf.getWidth()-radius*2){
//改变方向
vx = -vx;
}
if(y<=0 || y > jf.getHeight()-radius*2){
vy = -vy;
}
g.setColor(color);
g.fillOval(x, y, radius*2, radius*2);
}
}
}