Java基础教程——线程局部变量】的更多相关文章

线程局部变量 ThreadLocal,线程局部变量,不提供锁,不做线程共享,而是为每个线程提供变量的独立副本. import java.util.concurrent.*; public class TestThreadLocal { public static void main(String[] args) throws InterruptedException { ExecutorService es = Executors.newCachedThreadPool(); es.submit…
线程同步 synchronized:同步的 例:取钱 不做线程同步的场合,假设骗子和户主同时取钱,可能出现这种情况: [骗子]取款2000:账户余额1000 [户主]取款2000:账户余额1000 结果是社会财富增加1000,银行不开心. 代码如下所示: // 账户类 class Account { private int accountBalance = 2000; public void withdraw(String userName, int amount) { System.out.p…
启动新线程,需要和操作系统进行交互,成本比较高. 使用线程池可以提高性能-- 线程池会提前创建大量的空闲线程,随时待命执行线程任务.在执行完了一个任务之后,线程会回到空闲状态,等待执行下一个任务.(这个任务,就是Runnable的run()方法,或Callable的call()方法). Java 5之前需要手动实现线程池,Java 5之后直接支持线程池. Java.util.concurrent. Executors:用于创建线程池 |--|--Executors.newFixedThreadP…
线程状态 JAVA定义了6种线程状态: Thread.State public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; } 分别是: 新建状态·NEW 运行状态·RUNNABLE 阻塞状态·BLOCKED 无限等待状态·WAITING 休眠状态·TIMED_WAITING 死亡状态·TERMINATED 线程不可能一直运行,除非瞬间执行结束. 为了给其他线程执行的机会,正在执行的线程会被中断…
线程通信:等待.唤醒 Object方法 这些方法在拥有资源时才能调用 notify 唤醒某个线程.唤醒后不是立马执行,而是等CPU分配 wait 等待,释放锁,不占用CPU资源 notifyAll 唤醒全部等待的线程 重点:资源的有效利用 生产一个,消费一个:再生产一个,再消费一个 以热干面为例(生产者消费者问题): class 热干面 { int isOK = 0; } class 生产者 implements Runnable { 热干面 m; public 生产者(热干面 m) { thi…
Java基础教程:多线程基础(2)——线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 思维导图 等待/通知机制 不使用等待/通知机制 我们可以使用使用sleep()与 whle(true) 死循环来实现多个线程间的通信. 虽然两个线程实现了通信,但是线程B必须不断的通过while语句轮训机制来检测某一个条件,这样会浪费CPU资源. 如果轮询间隔较小,更浪费时间间隔.如果轮训时间间隔…
Java基础教程:多线程基础——线程池 线程池 在正常负载的情况瞎,通过为每一个请求创建一个新的线程来提供服务,从而实现更高的响应性. new Thread(runnable).start() 在生产环境中,为每一个任务分配一个线程的方法存在一些缺陷,尤其是需要创建大量线程时: 线程生命周期的开销非常高.线程的创建和销毁是需要代价的. 资源消耗.如果可运行线程数量多于可用处理器数量,那么有些线程将会闲置.大量空闲的线程将会占用许多内存,给垃圾回收器带来压力,而且大量线程在竞争CPU资源时还将产生…
Java:多线程基础(1) 实现多线程的两种方式 1.继承Thread类 public class myThread extends Thread { /** * 继承Thread类,重写RUN方法. */ @Override public void run() { super.run(); } } [说明] 由于Java继承机制,此处不再支持多继承. 2.实现Runnable接口 class myRunable implements Runnable { /** * 实现Runnable接口,…
Java基础教程:面向对象编程[3] 内容大纲 基础编程 获取用户输入 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入.我们可以查看JavaAPI文档来获取其功能声明: 基本语法: import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System…
Java基础教程:Java内存区域 运行时数据区域 Java虚拟机在执行Java程序的过程种会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁. 根据<Java虚拟机规范>,Java虚拟机管理的内存将会包括以下几个运行时数据区域 程序计数器 程序技术器是一块较小的内存空间,可视为当前线程所执行的字节码的行号计时器. 在多线程开发中,为了线程切换后能恢复到正确的执行位置,每…