1、进程和线程
一个程序的执行过程就是一个进程;而一个程序中的多个任务则被称为线程。
进程是资源分配的基本单位,持有资源(共享文件,共享内存)和线程;线程是进程中执行运算的最小单位,同一进程中有多个线程,线程共享进程的资源。
举个例子:
当我们打开计算机的任务管理器,会显示出当前机器的所有进程,QQ,微信等。当QQ运行时,就有很多子任务在同时运行。比如当我们边打字边好友视频时这些不同的功能都可以同时运行,其中每一项任务都可以理解成“线程”在工作。
2、使用多线程
在Java的开发中实现多线程编程的方式有两种,一种是继承 Thread 类,另一种是实现 Runnable 接口。这两个方法都继承自java.lang包,有一个同样的run方法(run方法提供线程执行的代码)。使用继承 Thread 类创建线程,最大的局限就是不能多继承,所以为了支持多继承,完全可以实现 Runnable 接口的方式。需要说明的是,这两种方式在工作时的性质都是一样的,没有本质的区别。
2.1线程的创建
- 继承Thread
public class Actor extends Thread{
public void run(){
}
public static void main(String[] args) {
Thread actor = new Actor();
actor.setName("Mr.Thread");
actor.start();
}
}
- 实现Runnable接口
class Actress implements Runnable{
public void run(){
}
}
public class Actor extends Thread{
public void run(){
}
public static void main(String[] args) {
Thread actress = new Thread(new Actress(), "Ms.actress");
actress.start();
}
}
2.2线程的方法
- void start() //启动线程
- static void sleep(long millis) //休眠线程指定时间,有重载方法
- void join(long millis) //使其他线程等待当前线程终止,有重载方法
- static void yield() //当前运行线程释放处理器资源
- static Thread currentThread() //返回当前运行的线程引用
2.3线程的停止
java自带stop方法,这个方法是java1.0的时候提出来的,随着时间的流逝,现在这个方法已经是错误的不再使用,最大的弊端就是强制停止了线程,我们不知道线程处理到什么地步就被突然关闭了。
那么正确的方法是什么呢,那就是设置一个退出旗标。如下所示:
@Override
public void run() {
while(keepRuning) {
for(int i = 0;i < 5;i++) {
System.out.println(Thread.currentThread().getName() + "进攻对方[" + i + "]次");
Thread.yield();
}
}
System.out.println(Thread.currentThread().getName() + "结束了战斗");
}
keepRuning就是我们设置的退出旗标,当它false的时候线程走完当前循环然后停止线程。使得我们一次任务可以被完整的完成。而大家所说的interrupt方法来中断线程也是错误的方法,并不能使线程停下来。如果仲尼中断线程后再调用isInterrupt方法来判断停止线程,其是指还是设置退出旗标。
2.3线程的同步与互斥
线程互斥的实现: synchronized(intrinsic lock),给代码加上锁,在当前线程时间内,其他线程不能访问线程的资源
线程同步的实现: wait()/notify()/notifyAll()调用wait使线程进入等待,调用notify或者notifyAll唤醒所有等待线程。