【Java基础】 多线程

一、进程与线程

1、含义
  • 进程:当我们打开一款程序,比如我们打开了电脑管家,那么电脑管家就是一个进程。
  • 线程:当我们的电脑管家同时进行病毒查杀,垃圾清理,电脑加速,那么就是多线程
2、关系
  • 一个正在运行的程序就是一个进程,他是程序运行的基本单位
  • 每个进程中执行的一个任务就是一个线程
  • 进程中包含多个线程,一个线程只属于一个进程
3、区别
  • 每个进程有一套自己的变量
  • 线程则共享同一份资源

二、创建线程的方法

1、继承Thread类
  • 继承Thread方法
  • 重写run()方法
  • 启动线程(线程对象.start()方法)
  • 不建议使用(因为面向对象有单继承的局限性)
//继承Thread
class TestThread extends Thread{
    //重写run()
    @Override
    public void run() {
        //super.run();使用父类的run()方法,如果不需要,去掉则执行子类的run()方法
        //需执行的任务逻辑
    }
}

public class TestDemo {
    public static void main(String[] str){
    	//启动线程对象
        TestThread testThread = new TestThread();
        //启动线程
        testThread.start();
   
2、实现runnable
  • 实现runnable
  • 重写run()方法
  • 启动线程(new Thread(线程对象).start())
  • 建议使用(避免了单继承的局限性,方便一个线程多个对象使用)
//实现Runnable
class TestThread implements Runnable{
    //重写run()方法
    @Override
    public synchronized void run() {
        //需执行的任务逻辑
    }
}

public class TestDemo {
    public static void main(String[] str){
    	//创建线程对象
        TestThread testThread = new TestThread();
        //启动线程
        new Thread(testThread).start();
        new Thread(testThread).start();
        new Thread(testThread).start();
    }
}
3、实现callable
  • 实现callable接口
  • 重写call方法
  • 创建线程对象
  • 创建执行服务:ExecutorService s = Executors.newFixedThreadPool(1);
  • 提交执行:Future result = s.submit(callable);
  • 获取结果:result.get();
  • 关闭服务:s.shutdownNow();
//实现Callable接口
class TestCallnble implements Callable {
    //重写call方法,相当于run方法
    @Override
    public Object call() throws Exception {
        return null;
    }
}
public class TestDemo {
    public static void main(String[] str){
        //创建线程对象
        TestCallable callable = new TestCallable();
        //创建执行服务
        ExecutorService service = Executors.newFixedThreadPool(1);
        //提交执行,相当于start()方法
        Future<Boolean> result = service.submit(callable);
        try {
            //获取返回结果
            result.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        //关闭服务
        service.shutdownNow();
    }
}
4、三者的区别与联系
  • 我们可以查看Thread源码,发现Thread实际上也是实现Runnable
class Thread implements Runnable
  • callable支持泛型的返回值,也可抛异常

三、run()和start()方法的区别

  • 调用start()线程启动新线程,进入就绪状态,等待CPU调度
  • 调用run()方法执行线程的任务,线程的状态不会发生变化,也不会启动新线程

四、线程的状态

  • 创建:当线程被创建时,如new Thread();
  • 就绪:当调用了start()方法后进入就绪状态。
  • 运行:cpu调度,获取时间片后进入运行状态。
  • 等待:当调用sleep(),wait()或者同步锁进入阻塞状态,阻塞状态解除后进入就绪状态等待cpu调度。
  • 死亡:线程中断或者结束。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值