?
何谓线程,线程是进程中某个单一顺序的控制流,也被称为轻量进程。计算机科学术语,指运行中的程序的调度位。???????
线程的基本概念:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
?
一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即main方法执行的那个线程。也可是被main方法调用的初始化方法中的线程。
Java中的线程有四种状态分别是:运行、就绪、挂起、结束。
调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。
前面我们提到过使用线程的利弊有:
1.好处:?·
1)可以把占据长时间的程序中的任务放到后台去处理。 ·2)用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。 3)程序的运行速度可能加快。 ·4)在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
2.缺点:
?????? 1)如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。2)更多的线程需要更多的内存空间。3)线程可能会给程序带来更多“bug”,因此要小心使用。4)线程的中止需要考虑其对程序运行的影响。5)通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。public class ThreadTest extends Thread { /** * 重写run()方法 JVM会自动调用该方法 */ public void run() { System.out.println("调用run方法!"); } }??????线程启动:
ThreadTest1 tt = new ThreadTest1(); tt.start();???2)通过实现Runnable接口
public class ThreadTest implements Runnable{ /** * 通过实现 Runnable接口创建线程 */ public void run() { System.out.println("调用run方法!"); } }?线程启动:
ThreadTest2 tt = new ThreadTest2(); Thread t = new Thread(tt); t.start();? 线程使用实例:
package 线程入门; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class Game { private JFrame jf; public void initUI(){ //实例化一个窗体对象,并设置一些相关属性 jf = new JFrame(); jf.setSize(500, 500); 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(); } }; //main方法 public static void main(String[] args) { new Game().initUI(); } }?
package 线程入门; import java.awt.Color; import java.awt.Graphics; import java.util.Random; import javax.swing.JFrame; /** * 定义一个MyThread类 * @author Administrator * */ public class Ball extends Thread{ //定义需要用到的一些属性 private JFrame jf ; private int x,y; private int vx=1,vy=2; private int radius = 30; private Color color; private boolean PauseFlag=false; private boolean StopFlag=false; public Ball(){ } //各属性赋初值 public Ball(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 setFlag(boolean PauseFlag){ this.PauseFlag = PauseFlag; } public void run(){ Graphics g = jf.getGraphics(); while(true){ try{ Thread.sleep(100); }catch(InterruptedException e){ e.printStackTrace(); } if(PauseFlag){ continue; } //得到窗体的背景颜色 g.setColor(jf.getBackground()); g.fillOval(x, y, radius*2, radius*2); if(StopFlag){ return; } 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); } } //自己实现线程的暂停 public void pause(){ PauseFlag = true; } //自己实现线程的暂停之后的再次开始 public void restart(){ PauseFlag = false; } //自己实现线程的暂停之后的再次开始 public void stopFlag(){ StopFlag = true; } }