b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

黑马程序员-基于JAVA的Day24多线程,死锁,线程间通信,线程组

电脑杂谈  发布时间:2020-05-28 23:17:53  来源:网络整理

多线程如何避免死锁_线程死锁 解决_解决线程死锁

--------- android培训,java培训,期待与您的交流! ----------

与使用同步方法和语句相比,Lock()实现提供了更广泛的锁定操作.

private Lock lock = new ReentrantLock();

锁定的代码应包含在lock.lock()lock.unlock()中. 哪个使用try. . . 终于被包围了

同步: 低效率. 如果发生同步嵌套,则会发生死锁. 但是安全.

死锁问题: 当两个或多个线程争用资源时,会出现互相等待的现象

线程间通信,不同类型的线程在同一资源上运行.

多个线程也可能具有相同的数据多次出现,或者输出不匹配. 都属于线程安全问题.

等待唤醒机制

在Object类中,wait()等待notify()唤醒单个线程notifyAll()唤醒所有线程

这些方法调用必须通过锁对象调用. 我们刚刚使用的锁定对象是任意锁定对象.

wait()被try catch包围,并唤醒notify()解决死锁

也就是说,在运行()中判断条件. 如果已建立,则该锁称为wait(). 如果未建立,则更改锁的判断条件多线程如何避免死锁,然后调用notify()唤醒.

运行状态图:

解决线程死锁_线程死锁 解决_多线程如何避免死锁

线程组: 默认情况下为主线程组

getThreadGroup()获取线程组

Thread.currentThread(). getThreadGroup(). getName();返回线程组的名称.

更改线程组

首先创建一个线程组: ThreadGroup tg = new ThreadGroup(“这是一个新的线程组”);

然后线程t1 =新线程(tg,Myrunnale,“线程名称”);

通过线程组名称设置后台线程,并使用tg.setDaemon()设置守护线程. 等等

线程组主要用于线程的统一管理.

也可以在类中进行同步,将相应的方法设置为同步. 请注意,方法中的锁定对象是这个

线程池: 启动程序的新线程的成本相对较高,因为它涉及与操作系统的交互. 其次,使用线程池可以提高性能,尤其是在程序中创建大量生命周期时. 使用短线程时多线程如何避免死锁,应考虑使用线程池.

线程池在每个线程结束后不会被破坏,而是返回到线程池并变为空闲状态.

staticExecutorService

newCachedThreadPool()

创建一个线程池,该线程池可以根据需要创建新线程,但是在可用之前重用以前构造的线程.

线程死锁 解决_解决线程死锁_多线程如何避免死锁

staticExecutorService

newFixedThreadPool(intnThreads)

创建一个可以重用固定数量的线程的线程池,并在共享的无界队列中运行这些线程.

staticExecutorService

newSingleThreadExecutor()

创建一个执行程序,该执行程序使用单个工作线程在无限制的队列中运行该线程.

A: 创建一个线程池对象并控制要创建多少个线程对象

ExecutorServoce newFixedThreadPool(int nThread)

B: 该线程池的线程可以执行:

可以执行Runnable对象或CallAble对象表示的线程

成为可运行的界面

C: 只需调用以下方法:

未来<?>提交(可运行任务)

未来提交(可调用任务)

NewFixedThreadPool静态函数,直接调用

解决线程死锁_线程死锁 解决_多线程如何避免死锁

1 ExecutorService pool=Executors.newFixedThreadPool(2);
2 pool.submit(new MyRunnable);

结束线程池: pool.shutdown();创建多线程模式3:

Callable是一个接口. 该线程具有返回接口,但可运行不返回任何结果. 类似于可运行的用法

他通过线程池创建线程. 这种不常见的Future表示提交异步计算的结果. 它提供了一种检查计算是否完成,等待计算完成并获得计算结果的方法. 计算完成后,您只能使用get方法获取结果. 如有必要,可以在计算完成之前阻止此方法. 取消通过cancel方法执行. 麻烦,通常不需要. 匿名内部类使用多个线程“

 1 //集成Thread类来实现多线程
 2         new Thread(){
 3             public void run() {
 4                 for (int i = 0; i < 100; i++) {
 5                     System.out.println(Thread.currentThread().getName()+":"+i);
 6                 }
 7             };
 8         }.start();
 9         //用Runnable接口实现
10         new Thread(new Runnable() {
11   
12             @Override
13             public void run() {
14                 // TODO Auto-generated method stub
15                 for (int i = 0; i < 100; i++) {
16                     System.out.println(Thread.currentThread().getName()+":"+i);
17                 }
18             }
19         }){}.start();

但是对于子类别,它将输出世界,而不是你好

 1 new Thread(new Runnable() {
 2   
 3     @Override
 4     public void run() {
 5         // TODO Auto-generated method stub
 6         for (int i = 0; i < 100; i++) {
 7             System.out.println("hello"+":"+i);
 8         }
 9     }
10 }){
11     public void run() {
12         for (int i = 0; i < 100; i++) {
13             System.out.println("world"+":"+i);
14         }
15     };
16 }.start();

计时器: 在指定的时间做某事或重复某件事

Timer是线程可以用来计划将来在后台线程中执行的任务的工具. 该任务可以安排为一次执行,也可以定期重复. <​​/ p>

依靠Timer和TimerTask两类

计时器

TimerTask: 任务构造方法摘要

计时器()

创建一个新计时器.

计时器方法

线程死锁 解决_多线程如何避免死锁_解决线程死锁

取消()

终止此计时器并放弃所有当前计划的任务.

清除()

从此计时器的任务队列中删除所有已取消的任务.

时间表(TimerTasktask,日期时间)

计划在指定的时间执行指定的任务.

时间表(TimerTasktask,DatefirstTime,长周期)

安排指定任务在指定时间开始重复执行固定延迟.

时间表(TimerTasktask,长延迟)

计划在指定的延迟后执行指定的任务.

时间表(TimerTasktask,longdelay,longperiod)

安排指定任务在指定延迟后开始重复执行固定延迟.

scheduleAtFixedRate(TimerTasktask,DatefirstTime,长周期)

安排指定任务在指定时间开始重复执行固定速率.

scheduleAtFixedRate(TimerTasktask,longdelay,longperiod)

安排指定的任务在指定的延迟后开始重复执行固定速率的操作.

面试问题


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-225767-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...