Java多线程

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();

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值