关于多线程的一点笔记

本文详细介绍了进程与线程的概念及区别,多线程编程的优点,创建线程的三种方式,以及线程的生命周期等内容。并通过对比Runnable和Callable,帮助读者理解如何在Java中有效地进行多线程编程。
进程:系统正在运行的程序。一个进程必须有一条线程
线程:可以“同时”实现执行多个任务的工作。在计算机里没有绝对意义上的同时做。线程的工作是并发的
线程是进程的执行单位
线程的执行时抢占式的

多线程编程的几个优点;
    进程之间不能共享内存。但线程之间共享内存非常容易
    系统创建进程是会为该进程重新分配系统资源。而创建线程代价小,多线程实现多任务并发比多进程效率高
    java内置的多线程功能支持,而不是单纯的作为底层操作系统的调度方式,简化了java多线程的编程

创建线程有3种方式
1,继承Thread
    两点不足
        1,由于继承Thread,当前类就不能扩展其他类。在实际开发项目麻烦
        2,由于线程内部重写的run方法决定了当前的线程要执行的任务。导致线程只会做这件事,不利于线程重用
2,实现Runnable接口,定义实现类。定义线程要执行的任务
3,用FutrueTask 包装实现了Callable(实现call方法)的类。直接执行任务,一般配合线程池使用
Future接口来代表Callable接口里的call()方法的返回值,并且为Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并且实现了Runnable接口——可以作为Thread类的target。实际上这里的FutureTask类实现了一个桥梁的作用,用于连接Callable对象和Thread对象。需要注意的是Callable接口有泛型限制,Callable接口里的泛型形参类型,与call()方法的返回值类型相同。

Callable和Runnable有几点不同:
        ①Callable规定的方法是call(),而Runnable规定的方法是run().
        ②Callable的任务执行后可返回值,而Runnable的任务是不能返回值的
        ③call()方法可抛出异常,而run()方法是不能抛出异常的。
        ④运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果.通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果
Future和Callable是一对,他俩基本上是搭配使用的。Future里的值是从Callable的call返回的。如果一时没有得到,那么Future的get方法会阻塞的!

线程的声明周期
NEW,Runnable,Running,blocked,dead

可以用匿名内部类来实现创建两种线程
Thread.sleep();使当前线程进入阻塞状态指定的毫秒。当超时后,线程会自动回到Runnable状态。等待再次分配时间片
Thread.currenThread();获取运行该方法的线程
?.setPriority();设置线程的优先级。(1-10);
long getId():返回该线程的标识符
String getName():返回该线程的名称
int getPriority():返回线程的优先级
Thread.state getState():获取线程的状态
boolean isAlive():测试线程是否处于活动状态
boolean isDaemon():测试线程是否为守护线程
boolean isInterrupted():测试线程是否已经中断
线程池,ExecutorSerice threadPool=Eexcutors.newFixedThreadPool(数量)
    给任务池指派任务:threadPool.execute(new Runnable(){重写方法};)这是简写。只是为了知道
    threadPool.shutdown();任务结束后关闭任务池
?.join();调用join,会使线程进入阻塞状态,直到前个线程结束才会在执行程序
?.setDaemon(true);设置一个线程为守护线程,只有在前台线程存在的情况下存在。
synchronized(同步监听器){需要同步的代码块},防止并发问题,当一个方法被synchronized修饰后,怎锁的是该方法所属的对象,多个线程不能同时访问
两个线程都在等待对方释放锁所处于的僵持状态就叫做死锁
wait和notify,这两个方法都定义在object上。所有的对象都有这两个方法。当一个线程调用一个对象的wait后,该线程进入阻塞状态。直到这个对象的notify被调用。当前线程方可解除阻塞zhuangt

一个方法的局部内部类中,想要引用变量,则变量必须要用final修饰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值