-
计算机处理器CPU在同一时间,同一事件只能运行一个线程!查看全部
-
创建线程两种方式:进程Tread类或者实现Runnable 接口interface,他们都继承 lang 包,并且都重写 run 方法。查看全部
-
1,线程是系统中最小的执行单元 2,同一进程中有多个线程 3,线程共享进程的资源 线程的交互 互斥:需要等待前面线程执行完成了后面的线程才能执行 同步:需要线程合作才能完成查看全部
-
1.Java Memory Mode:JMM 描述了Java线程如何通过内存进行交互; happens-before原则; synchronized,volatile&final 2.Locks&Condition Java锁机制和等待条件的高层实现; 了解程序加锁和通信; java.util.concurrent.locks 3.线程安全性: 原子性与可见性,通过java.util.concurrent.atomic包避免原子性编程问题,一个原子由多个操作语句构成时通过synchronized实现原子性; synchronized&volatile 实现可见性; DeadLocks死锁及其产生条件,进而书写避免死锁线程 4.多线程编程常用的交互模型: Producer-Consumer 模型 Read-Write Lock 模型 Future 模型 Worker Thread 模型 5.Java5中并发编程工具 java.util.concurrent; 线程池ExecutorService Callable & Future BlockingQueue 6.推荐书本:CoreJava & JavaConcurrency In Practice查看全部
-
1.互斥的实现:对关键数据加锁,关键数据在同一个时间只被一个线程使用。 2.同步的实现:wait(),notify(),notifyAll()--Object 3.Wait Set: 类似于线程的休息室,访问共享数据的代码称为critical section(锁资源)。一个线程获取锁,然后进入临界区 ,发现某些条件不满足,然后调用锁对象上的wait方法,然后线程释放掉锁资源,进入锁对象上的wait set。其他线程可以获取锁资源,执行,以后调用notify(唤醒某个wait set中的线程)/notifyAll(唤醒wait set中的所有线程),通知锁对象上的等待线程。查看全部
-
线程交互——争用条件 1、当多个线程同时共享访问同一数据(内存区域)时,每个线程都尝试操作该数据,从而导致数据被破坏(corrupted),这种现象称为争用条件。 2、原因是,每个线程在操作数据时,会先将数据初值读【取到自己获得的内存中】,然后在内存中进行运算后,重新赋值到数据。 3、争用条件:线程1在还【未重新将值赋回去时】,线程1阻塞,线程2开始访问该数据,然后进行了修改,之后被阻塞的线程1再获得资源,而将之前计算的值覆盖掉线程2所修改的值,就出现了数据丢失情况。 线程交互——互斥与同步 一、互斥 1、同一时间,只能有一个线程访问数据 二、同步 1、是一种通信机制,一个线程操作完成后,以某种方式通知其他线程 三、实现方法 1、【互斥】构建锁对象(Object objLock),通过synchronized(lockObj){ 互斥的代码块 } 2、加锁操作会开销系统资源,降低效率。 3、在某线程的条件不满足任务时,使用lockObj.wait()对线程进行阻挡,防止其继续竞争CPU资源,滞留在wait set中,等待唤醒,【唤醒后继续完成业务】 4、【同步】在某一代码正确执行完业务后,通过lockObj.notifyAll()唤醒所有在lockObj对象等待的线程查看全部
-
不能用stop停止正在执行的线程,否则会让程序戛然而止,导致有些工作还没有完成程序就终止运行。 如何正确停止线程?--使用退出标志 如:volatile boolean keepRunning=true; 这样做的好处是:使得线程有机会使得一个完整的业务步骤被完整地执行,在执行完业务步骤后有充分的时间去做代码的清理工作,使得线程代码在实际中更安全。 interrupt方法初衷并不是用于停止线程,interrupt()方法只能设置interrupt标志位(且在线程阻塞情况下,标志位会被清除,更无法设置中断标志位),无法停止线程 在调用sleep()或者join()的时候,一旦其他线程调用interrupt(),它将会收到一个异常,这些被阻塞的线程因为某些原因需要被唤醒,比如外部发生了中断而需要响应,这时就采用抛出异常的方式来使其作出响应。总而言之,interrupt()方法并不能正确地停止线程 当前线程是否被中断,isInterrupted()和interrupted() 当线程正处于某些方法中,如sleep(),会出现两种情况: 1.sleep方法收到interrupt异常; 2.interrupt状态被清空查看全部
-
join方法可中断其它线程的执行,等待调用join方法的线程结束,才能执行其他线程的后续任务,即使是主线程main也会被中断 join()的作用是:“等待该线程终止”,这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。查看全部
-
Thread.yield();//让出处理器时间,公平竞争 volatile boolean keepRunning;//volatile 保证了线程可以正确地读取其他线程写入的值,如果不写成volatile,由于可见性的问题,当前线程有可能不能读到这个值//可见性JMM(JAVA内存模型)happens-before原则、可见性原则 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的值,即虚拟机将直接存取原始内存地址,而不是编译器优化后的寄存器地址 加入join()是为了让舞台线程最后停止,如果不加有可能舞台线程结束,军队线程还未停止,就好比导演喊停,演员还在演!可以在join()后面加入测试语句System.out.println("舞台结束!");,然后去掉或者保留join()观察效果。查看全部
-
join方法可中断其它线程的执行,等待调用join方法的线程结束,即使是主线程main也会被中断 join()的作用是:“等待该线程终止”,这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。查看全部
-
Java对线程的支持主要体现在Thread类和Runnable接口上,它们都在java.lang包中,都存在public void run()方法 Thread常用方法(如图)查看全部
-
进程:动态性 程序或任务的执行的过程, 持有资源(共享内存,共享文件)和线程(进程是它们的载体) 线程: 系统中最小的执行单元,同一进程中有多个线程。线程共享进程的资源 线程交互:即线程通信 线程间存在同步(共同合作)和互斥(竞争资源)查看全部
-
实现类和接口查看全部
-
进程:动态性 程序或任务的执行的过程, 持有资源(共享内存,共享文件)和线程(进程是它们的载体) 线程: 系统中最小的执行单元,同一进程中有多个线程。线程共享线程的资源 线程交互:即线程通信 线程间存在同步和互斥查看全部
-
实现线程同步,使用localobject与notifyall方法实现线程同步。查看全部
举报
0/150
提交
取消