线程和进程
进程:是执行中一段程序, 进程是系统进行资源分配和调度的一个独立单位.
线程:比进程更小的能独立运行的基本单位,单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。
Thread类
Thread的方法
方法 | 说明 |
---|---|
start | 开始运行线程 |
yield | 谦让 |
join | 合并 |
interrupt | 线程中断 |
isAlive | 线程是否活动 |
setPriorty | 设置优先级 |
stop()[@Deprecated] | 终止线程。强制终止,释放线程的锁,可能引起数据不一致问题。 |
suspend()[@Deprecated] | 挂起,暂停执行线程。 |
resume() [@Deprecated] | 恢复,继续执行线程。 |
静态方法 | 说明 |
---|---|
Thread.currentThread() | 取得当前线程 |
Thread.sleep(N) | 线程终止N毫秒 |
Thread.interrupt() | 判断是否中断,并清除中断状态 |
Thread的状态
java中定义线程的类如下
public enum State{
NEW, //创建
RUNNABLE, //运行,执行start后
BLOCKED, //阻塞,进入同步块
WAITING, //等待,无时间限制等待,调用wait()方法
TIMED_WAITING, //等待,有时间限制等待,调用wait(n),sleep(n) 方法
TERMINATED //结束
}
新建状态(New)
当用 new 创建一个线程并且还未启动的线程处于这个状态。运行状态(Runable)
调用 start 方法后。Runable包含了操作系统线程状态的Running 和Ready,可能线程正在执行,也可能线程在等待CPU分配执行时间。无限期等待(Waiting)
线程进入等待状态,等待被其他线程唤醒才能继续执行。例如:调用 object.wait() 方法,Thead.join()方法等等
有限期等待(Timed Waiting)
线程进入等待状态,在一定时间后会由系统自动唤醒。例如:调用 object.wait(N) 方法,Thead.join(N)方法等等
阻塞状态(Blocked)
线程的执行过程中由于一些原因进入阻塞状态
比如:进入同步代码块、尝试去得到一个锁等等结束状态(Terminated)
线程终止状态,run 方法执行完 或者 执行过程中遇到了一个异常
状态转换关系图
4. JAVA多线程的3种实现方式:
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口
代码:
继承Thread类
继承Thread类,重写run方法
线程代码
/**
* MyThread.java
*/
public class MyThread extends Thread{
@Override
public void run(){
System.out.println("mythread");
}
}
运行代码
Thread thread = new MyThread();
thread.start();
System.out.println("thread start...");
说明
- 启动线程不是run方法,而是start方法。
- 调用start方法后,线程不会马上运行,只有当cpu调度分配运行时间后,才会运行
- 创建线程时,最好传入有意义的线程名。方便问题定位。
实现Runnable接口
线程代码
/**
* MyRunnable.java
*/
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("my runnable...");
}
}
运行代码
Thread thread = new Thread(new MyRunnable());
thread.start();
System.out.println("thread start...");
区别
- Thread类和Runnable接口的区别,在于数据的共享。
- 继承Thread类,由于java单继承的原因无法共享数据。
- 而实现Runnable接口,可以多个类实现同一个Runnable接口,从而共享接口中的数据。
重写Callable接口
线程代码
public class MyCallable implements Callable<String>{
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
return "Callable";
}
}
运行代码
//Callable
FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
Thread myTask = new Thread(futureTask);
myTask.start();
try {
String result = futureTask.get();
System.out.println(result);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}