何谓线程,线程是进程中某个单一顺序的控制流,也被称为轻量进程。计算机科学术语,指运行中的程序的调度位。
线程的基本概念:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。
一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即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; } }
相关推荐
java多线程总结
C#.net同步异步SOCKET通讯和多线程总结2[参照].pdf
MFC 多线程总结, 开发为于windows的应用程序开发
JAVA多线程总结
这是我总结整理的Java线程总结,希望对大家有所帮助!
C#.net同步异步SOCKET通讯和多线程总结
C++多线程总结[归纳].pdf
C_同步异步SOCKET通讯和多线程总结.doc
Java线程总结.pdf
C# 多线程总结,比较详细和全面,包含多种方式的多线程方法的说明。
【完整课程列表】 1-java_IO(1)(共47页).ppt 1-java_IO(2)(共28页).ppt 2-oracle基础(1)(共48页).ppt 2-oracle基础(2)(共48页).ppt 3-oracle查询和SQL函数(共43页).ppt ...8-IO&线程总结(共7页).ppt
java多线程总结
C#dotnet同步异步SOCKET通讯和多线程总结
Java多线程总结.pdf
线程总结笔记 linux笔记。
C#.net同步异步SOCKET通讯和多线程总结 同步套接字通信 Socket支持下的网上点对点的通信 服务端实现监听连接,客户端实现发送连接请求,建立连接后进行发送和接收数据的功能 服务器端建立一个socket,设置好本机的ip...
不错的线程总结(全面上)1
详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 ...Java线程:大总结