`
打酱油的小瓶子
  • 浏览: 8109 次
最近访客 更多访客>>
lso
社区版块
存档分类

线程总结

    博客分类:
  • java
阅读更多

 

何谓线程,线程是进程中某个单一顺序的控制流,也被称为轻量进程。计算机科学术语,指运行中的程序的调度位。       
线程的基本概念:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。

 

一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即main方法执行的那个线程。也可是被main方法调用的初始化方法中的线程。

Java中的线程有四种状态分别是:运行、就绪、挂起、结束。

调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。

前面我们提到过使用线程的利弊有:

1.好处: ·

1)可以把占据长时间的程序中的任务放到后台去处理。 ·2)用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。 3)程序的运行速度可能加快。 ·4)在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

2.缺点:

       1)如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。2)更多的线程需要更多的内存空间。3)线程可能会给程序带来更多“bug”,因此要小心使用。4)线程的中止需要考虑其对程序运行的影响。5)通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
       总的来说关于线程的使用,要在恰当的情况下,特别是多线程的使用,不能一味求快而盲目多加线程。   
线程的几种使用方法:1) 用一个类去继承java.lang.Thread类,之后重写run()方法,将需要执行的代码放入该方法中。在该线程的start()方法被调用后,JVM会自动调用run()方法。该方法定义线程,有比较大的局限性,采用继承Thread方法定义线程之后就不能再继承其他类,程序可拓展性大大降低,所以不建议使用这个方法来定义线程。
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;
	}
	

	
}
 
1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics