-
Java线程——线程交互——互斥与同步 一、互斥 1、同一时间,只能有一个线程访问数据 二、同步 1、是一种通信机制,一个线程操作完成后,以某种方式通知其他线程 三、实现方法 1、【互斥】构建锁对象(Object objLock),通过synchronized(lockObj){ 互斥的代码块 } 2、加锁操作会开销系统资源,降低效率。 3、在某线程的条件不满足任务时,使用lockObj.wait()对线程进行阻挡,防止其继续竞争CPU资源,滞留在wait set中,等待唤醒,【唤醒后继续完成业务】 4、【同步】在某一代码正确执行完业务后,通过lockObj.notifyAll()唤醒所有在lockObj对象等待的线程 ------------------------------------ 实现互斥与同步: 1、private final Objecct LockObj = new Object(); 2、synchronized(LockObject){需要互斥操作的代码}。将LockObj锁定起来,只有持有LockObj的线程才能访问代码。 3、优化性能,让不满足条件的线程等待一段时间,而不重复使用cpu。while(条件){LockObj.wait();}通过.wait()方法释放锁。 4、当线程满足条件(没有执行LcokObj.wait()),在主代码执行完毕后,加上LockObj.notifyAll()来唤醒全部执行了LockObj.wait()的线程。 ---------------------------- synchronized锁关键字实现线程互斥 持续的申请锁会降低系统性能,所以这里需要使用wait()方法,让线程进入一个等待的状态,从而避免了线程不停的持续申请锁,降低系统的性能 lockObj.notifyAll(); 唤醒所有在lockObj对象上等待的线程查看全部
-
争用条件查看全部
-
Java线程——线程交互——争用条件 1、当多个线程同时共享访问同一数据(内存区域)时,每个线程都尝试操作该数据,从而导致数据被破坏(corrupted),这种现象称为争用条件 2、原因是,每个线程在操作数据时,会先将数据初值读【取到自己获得的内存中】,然后在内存中进行运算后,重新赋值到数据。 3、争用条件:线程1在还【未重新将值赋回去时】,线程1阻塞,线程2开始访问该数据,然后进行了修改,之后被阻塞的线程1再获得资源,而将之前计算的值覆盖掉线程2所修改的值,就出现了数据丢失情况查看全部
-
1.获取线程名称:getName(); 2.取得当前线程对象:currentThread(); 3.判断是否启动:isAlive(); 4.强行运行:join(); 5.线程休眠:sleep(); 6.线程礼让:yield(); 线程停止: 1、调用stop()方法会使线程戛然停止,而无法知道线程任务完成情况,官方已经不推荐使用。 2、interrupt()方法设置线程的标识位,并在线程中判断标志位的状态,从而结束线程,但是当在线程中开启了另外的线程时,比如在线程中Tread.sleep(),这时候调用interrupt()方法设置标志位可能设置的是你想要停止的线程,也可能是想要停止的线程中的线程的标志位,因此interrupt()方法也并不能很好的结束线程。 3、第三种方法,在线程的类声明一个volatile变量来记录线程的状态,相当于interrupt()方法那样,volatile关键字表示线程中的变量可以接受外部其他线程改变。因此可以在需要停止的地方设置volatile声明的变量的值设置为状态,并在执行run()函数里判断是否结束。 什么时候使用thread 什么时候使用runnable 其实两种方式效果一样,但推荐使用runnable 因为Java是单继承,继承了thread就不能继承其他的类 而实现runnable接口的话,扩展性要好很多查看全部
-
interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态,然后该线程还是继续运行的 @Java线程——如何正确停止线程 一、错误一:stop()方法 1、not stop:stop()方法会使线程戛然而止 2、使程序突然中止,无法完成完整的业务步骤,也无法进行清理工作 二、错误二:interrupt()方法 1、interrupt()方法只能设置interrupt标志位(且在线程阻塞情况下,标志位会被清除,更无法设置中断标志位),无法停止线程 三、正确方法:设置退出标志 1、使用退出标志位来停止while循环 2、完成最后一次业务后跳出while循环后,之后进行一些清理工作查看全部
-
isInterrupted public boolean isInterrupted()测试线程是否已经中断。线程的中断状态 不受该方法的影响。 线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。 返回: 如果该线程已经中断,则返回 true;否则返回 false。 另请参见: interrupted()查看全部
-
interrupted public static boolean interrupted()测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。 线程中断被忽略,因为在中断时不处于活动状态的线程将由此返回 false 的方法反映出来。 返回: 如果当前线程已经中断,则返回 true;否则返回 false。 另请参见: isInterrupted()查看全部
-
interrupt public void interrupt()中断线程。 如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException。 如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。 如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。 如果该线程在一个 Selector 中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的 wakeup 方法一样。 如果以前的条件都没有保存,则该线程的中断状态将被设置。 中断一个不处于活动状态的线程不需要任何作用。 抛出: SecurityException - 如果当前线程无法修改该线程查看全部
-
如何正确停止线程? --使用退出标志 如本例:volatile boolean keepRunning=true; 这样做的好处是:使得线程有机会使得一个完整的业务步骤被完整地执行,在执行完业务步骤后有充分的时间去做代码的清理工作,使得线程代码在实际中更安全查看全部
-
进程:程序(任务)的执行过程,动态性 持有资源(共享内存,共享文件)和线程 资源(内存),线程(小任务),班【进程】,学生【线程】 线程是系统中最小的执行单元,同一进程中有多个线程,线程共享进程的资源 线程的交互:互斥(竞争)、同步(协作)查看全部
-
发现好多高手,值得学习! stop方法使得线程戛然而止,完成了什么工作,哪些工作还没有做,都不知道,且清理工作也没有做,所以不是正确的停止线程方法 正确的停止线程方法是,在线程执行中设置状态标识,通过控制标识来控制线程正常完整的执行结束线程 volatile是保证所有子线程里的变量都能同步到主内存里变量的值 不要用stop()方法结束线程查看全部
-
欢迎观看隋唐演义! 大幕徐徐拉开 话说隋朝末年,隋军与农民起义军杀得昏天黑地…… 农民起义军进攻对方[0] 农民起义军进攻对方[1] 农民起义军进攻对方[2] 农民起义军进攻对方[3] 农民起义军进攻对方[4] 隋军进攻对方[0] 隋军进攻对方[1] 隋军进攻对方[2] 隋军进攻对方[3] 隋军进攻对方[4] 隋军进攻对方[5] 隋军进攻对方[0] 隋军进攻对方[1] 隋军进攻对方[2] 隋军进攻对方[3] 隋军进攻对方[4] 隋军进攻对方[5] 隋军进攻对方[0] 隋军进攻对方[1] 隋军进攻对方[2] 隋军进攻对方[3] 隋军进攻对方[4] 隋军进攻对方[5] 隋军进攻对方[0] 双方激战正酣,半路杀出个程咬金 程咬金的理想就是结束战争,使百姓安居乐业! 农民起义军进攻对方[5] 隋军进攻对方[1] 隋军进攻对方[2] 隋军进攻对方[3] 隋军进攻对方[4] 隋军进攻对方[5] 战争结束,人民安居乐业,程先生实现了积极的人生梦想,为人民做出了贡献! 谢谢观看隋唐演义,再见! 程咬金开始了战斗! 程咬金左突右击,攻击隋军……! 程咬金左突右击,攻击隋军……! 程咬金左突右击,攻击隋军……! 程咬金左突右击,攻击隋军……! 程咬金左突右击,攻击隋军……! 程咬金左突右击,攻击隋军……! 程咬金左突右击,攻击隋军……! 程咬金左突右击,攻击隋军……! 程咬金左突右击,攻击隋军……! 程咬金左突右击,攻击隋军……! 程咬金开始了战斗!查看全部
-
Thread 常用方法查看全部
-
明天早起接着敲查看全部
-
Thread常用方法查看全部
举报
0/150
提交
取消