线程的基本概念
线程:是一个程序里面不同的执行路径。
Java中的线程是通过Thread类来实现的,每一个Thread类对象代表一个新的线程。
- 通过创建Thread的实例来创建新的线程
- 每个线程通过每个特定Thread对象所对应的方法run()来完成其操作,也就是说将要执行的代码写在run()内,run方法称为线程体。
- 通过调用Thread类的start()方法来启动一个线程。
1 //通过继承Thread类来创建线程。Thread本身就继承了Runnable接口 2 public class TestThread1{ 3 public static void main(String args[]){ 4 Runner1 r = new Runner1(); 5 r.start(); 6 for(int i=0; i<100; i++){ 7 System.out.println(" Main ---" + i); 8 } 9 } 10 } 11 class Runner1 extends Threads{ 12 public void run(){ 13 14 for(int i=0; i<100; i++){ 15 System.out.println(" Runner1 ---" + i); 16 } 17 } 18 }
第二个实现线程的方法是实现Runnable接口。
1 //通过实现Runnable接口来创建线程 2 public class TestThread1{ 3 public static void main(String args[]){ 4 Runner1 r = new Runner1(); 5 Thread t = new Thread(r); 6 t.start(); 7 for(int i=0; i<100; i++){ 8 System.out.println(" Main ---" + i); 9 } 10 } 11 } 12 class Runner1 implements Runnable{ 13 public void run(){ 14 for(int i=0; i<100; i++){ 15 System.out.println(" Runner1 ---" + i); 16 } 17 } 18 }
经常需要使类在其自身线程中执行代码,但如果该类继承自Thread类,那么就不能继承其他类的功能,因为java不支持多重继承。与实现Runnable接口相比,Thread类的继承并无功能优势,这两种办法的难度也相当,因此经常将实现Runnable接口作为首选方法。
更简单的方法是定义实现Runnable接口的匿名内类:
1 package com; 2 import java.awt.*; 3 import java.awt.event.*; 4 import javax.swing.*; 5 public class ButtonPress extends JFrame { 6 7 public static void main(String[] args){ 8 ButtonPress bp = new ButtonPress(); 9 bp.setSize(400, 300); 10 bp.setVisible(true); 11 } 12 13 public ButtonPress(){ 14 JMenuBar jmb = new JMenuBar(); 15 JMenu menu = new JMenu("Execute"); 16 jmb.add(menu); 17 JMenuItem jmi = new JMenuItem("Database Query"); 18 menu.add(jmi); 19 jmi.addActionListener(new ActionListener(){ 20 public void actionPerformed(ActionEvent event){ 21 Thread t = new Thread(new Runnable(){ 22 public void run(){ 23 performDatabaseQuery(); 24 } 25 }); 26 t.start(); 27 } 28 }); 29 setJMenuBar(jmb); 30 } 31 protected void performDatabaseQuery(){ 32 try{ 33 Thread.sleep(5000); 34 }catch (Exception e){ 35 36 } 37 ; 38 } 39 }
方法 | 功能 |
---|---|
isAlive() | 判断线程是否活着,即线程是否还未终止 |
getPriority() | 获得线程的优先级数值 |
setPriority() | 设置线程的优先级数值 |
Thread.sleap() | 将当前线程睡眠指定毫秒数 |
join() | 调用某线程的该方法,将当前线程与该线程“合并”,即等待该线程结束,在恢复当前线程的运行 |
yield() | 让出cpu,当前线程进入就绪队列等待调度 |
wait() | 当前线程进入对象的wait pool |
notify()/notifyAll() | 唤醒对象的wait pool中的一个/所有等待线程 |