使用线程
在Java中使用线程
线程是进程的基本调度单位
Java提供Thread类来实现多线程
多线程的基本概念
微处理器将内存分配给应用程序执行的进程,进程中所有线程都共享相同的地址空间。
多线程的优点和缺点
-
优点:
-
改进性能
最小化系统资源使用
简化程序结构
缺点:
-
竞争情况
死锁情况
锁饥饿
Thread类
-
常用方法:
-
int getPriority() :
返回线程的优先级
boolean isAlive() :确定线程是否还在运行
static void sleep(long milliseconds) :使线程暂停运行指定的一段时间
String getName() :返回线程的名称
void start() :通过调用run()方法启动线程
static Thread currentThread() :返回当前正在执行的线程对象
public final void join () : 允许线程等待直到调用该方法的线程为止
void interrupt():用于使线程中断
static boolean interrupted() ;用于确定该线程是否被中断
线程的生命周期
-
新创建
-
可运行:当start()方法被调用时,线程进入可运行状态。start()方法将线程的控制权交给操作系统,此时线程可运行但并未在运行,它需要排队等候处理器时间;直到操作系统有足够的资源后,调用线程的run()方法,此时才为运行状态。
-
不可运行:以下几种情况处于“不可运行状态”
休眠:sleep()方法
等待:调用object类的wait()方法;直到其他线程调用object类的notify()或notifyAll()方法,此线程进入“可运行”状态
锁定:
主线程等待:join()方法
正被其他线程阻止: 如果线程被I/O操作阻止,进入不可运行状态 -
死亡 :
①run()方法中的语句全部执行完毕
②将线程对象设置成null
③调用stop()方法
创建线程
继承Thread类:重写run()方法,调用start()方法时自动调用run()方法
实现Runnable接口:
-
当一个类想要创建线程,但它已经继承了另一个类(例如已经继承了JFrame类),因为Java只支持一个类只能继承一个类,不支持多继承,所以我们使用Runnable接口来解决。Runnable接口仅包括run()方法,启动线程时默认执行此方法。
-
调用run()方法时,该线程脱离主线程控制,与主线程并行执行。
-
实现Runnable接口的类不能直接创建Thread类的实例,需要作为参数包装到Thread类的构造函数中,新线程对象通过调用start()方法开始执行。
public static void main(String args[])
{
CountdownTimer obj=new CountdownTimer();
Thread CountdownThread=new Thread(obj);
CountdownThread.start();
}
了解线程的优先级
设置线程优先级
通过Thread类的setPriority()方法设置其优先级
public final void setPriority(int newPriority)
优先级的范围介于MIN_PRIORITY和MAX_PRIORITY之间(即1-10)
实现线程同步
1.使用同步方法
synchronized关键字能够同步方法,当线程在同步方法内的时候,所有试图在同一时间调用方法的其他线程必须等待。
class employee{
public synchronized int process(){
//code to process the salary
}
}
在上述代码中,process()是同步方法,不能在一个时间被多个线程访问
2.同步代码块
synchronized(obj)
{
/*statement to be synchronized*/
}
实现线程间通信
方法:
- wait(): 使当前线程等待,直到其他线程调用notify()方法。用于释放临时锁
- notify():唤醒正在等待的线程。如果有多个,随机选一个。
- notifyAll():唤醒正在等待的所有线程。