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