Java多线程
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
多进程是指操作系统能同时运行多个任务(程序)。
多线程是指在同一程序中有多个顺序流在执行。
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口.(其实准确来讲,应该有三种,还有一种是实现Callable接口,并与Future、线程池结合使用。
Thread类
start():启动一个线程中的run()方法
run(): 覆盖Thread中的run方法,所要执行的操作
currentThread(): 静态方法,返回执行当前代码的线程
getName():获取线程的名字
setName():设置当前线程的名字
yield():释放cpu的执行权
join():在线程a中调用线程b的join,a会进入阻塞状态,直至b线程执行完毕,a线程才会被释放
sleep():设置线程睡眠时间
isAlive():判断线程是否存活
线程优先级
MIN_PRIORITY:1
NORM_PRIORITY:5
MAX_PRIORITY:10
线程优先级
getpriority():获取
setpriority():设置
实现Runnable接口
class MineThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if(i%2==0) System.out.println(i);
}
}
}
public class TestRunable {
public static void main(String[] args) {
MineThread mineThread = new MineThread();
Thread t1 = new Thread(mineThread);
t1.start();
}
}
两种方式的比较
1.实现Runnable接口不存在继承Thread类的局限性(java单继承)。
2.实现的方式更适合多个线程共享数据的情况
生产者消费者
/**
* @description: 生产者消费者案例
**/
class Phone{
private int phoneNum = 0;
public synchronized void add(){
if(phoneNum <100){
phoneNum++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"生产了"+phoneNum+"部手机");
notify();
}else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void reduce(){
if(phoneNum>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"购买了"+phoneNum+"部手机");
phoneNum--;
notify();
}else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 生产者
class Producer implements Runnable{
private Phone phone;
public Producer(Phone phone) {
this.phone = phone;
}
@Override
public void run() {
while (true){
phone.add();
}
}
}
// 消费者
class Consumer implements Runnable{
private Phone phone;
public Consumer(Phone phone) {
this.phone = phone;
}
@Override
public void run() {
while (true) {
phone.reduce();
}
}
}
public class ProducerConsumer {
public static void main(String[] args) {
Phone phone = new Phone();
Producer producer = new Producer(phone);
Consumer consumer = new Consumer(phone);
Thread p = new Thread(producer);
p.setName("生产者");
Thread c = new Thread(consumer);
c.setName("消费者");
p.start();
c.start();
}