前言:
多线程机制是JAVA语言又一重要特征,使用多线程技术可以使系统同时运行多个执行体,提高计算机资源的利用率和整个应用系统的性能。今天主要练习的是多线程机制、Thread类、以及线程的应用机制。
一问一答:
Q:为什么要用多线程?
A"通常,把操作系统的多个任务称为进程(Process),而程序中的多任务则称为线程。每个进程都拥有一组完整的属于自己的变量,而线程则共享这些数据。线程的优势在于创建和注销线程的开销比运行新的进程少得多,所以现在主流的操作系统都支持多线程。而且,和进程间的通信相比,线程间的通信要快得多,也方便得多。
创建线程:
创建线程第一种方法是继承线程类java.lang.Thread。相关的方法有:
1、run():该方法用于线程的执行。在线程启动后会调用该方法。你需要重载该方法,以便让线程做特定的工作。
2、start():该方法使得线程启动run()方法。
例:通过多线程实现球移动的动画:点击"Start"按钮,则从左上角生成一个球在界面移动并反弹;点击"Close"按钮则退出程序。
效果图1.png 代码如下:import java.awt.;
import java.lang.;
import java.awt.event.;
import javax.swing.;
import java.util.*;
public class BallGame extends JFrame implements ActionListener
{
JButton jbtStart = new JButton("Start");
JButton jbtStop = new JButton("Stop");
MainPanel mp = new MainPanel();
public BallGame()
{
this.getContentPane().add(mp,BorderLayout.CENTER);
mp.setBackground(Color.white);
JPanel p=new JPanel();
p.add(jbtStart);
p.add(jbtStop);
this.getContentPane().add(p,BorderLayout.SOUTH);
jbtStart.addActionListener(this); //监听事件
jbtStop.addActionListener(this);
}
public static void main(String[] args)
{
BallGame bt = new BallGame();
bt.setSize(300,300);
bt.setVisible(true);
bt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==jbtStart)
{
BallThread b=new BallThread(mp);
mp.balls.addElement(b);
b.start();
}
else
{
System.exit(0);
}
}
}
class MainPanel extends Panel
{
public Vector balls=new Vector();
public void paint(Graphics g)
{
for(int i=0;i<balls.size();i++)
{
BallThread ball = (BallThread)balls.elementAt(i);
ball.draw();
}
}
}
class BallThread extends Thread
{
MainPanel mainPanel;
private static final int XSIZE=20;
private static final int YSIZE=20;
private int x=0;
private int y=0;
private int dx=2;
private int dy=2;
public BallThread(MainPanel b)
{
mainPanel=b;
}
public void draw()
{
Graphics g=mainPanel.getGraphics();
g.fillOval(x,y,XSIZE,YSIZE);
g.dispose();
}
public void move()
{
x+=dx;
y+=dy;
Dimension d=mainPanel.getSize();
if(x<0){x=0;dx=-dx;}
if(y<0){y=0;dy=-dy;}
if(x+XSIZE>=d.width ) {x=d.width -XSIZE;dx=-dx;}
if(y+YSIZE>=d.height ) {y=d.height -YSIZE;dy=-dy;}
mainPanel.repaint();
}
public void run()
{
try
{
draw();
while(true)
{
move();
sleep(30);
}
}catch(Exception e){ }
}
}
关于多线程的练习题及源码下载地址:http://pan.baidu.com/s/1bo60JGb 密码: 3mma
网友评论