Java 多线程 (转)
http://www.ibm.com/developerworks/cn/java/j-thread/index.html
http://www.ibm.com/developerworks/cn/java/multithreading/index.html
http://www.ibm.com/developerworks/cn/education/java/j-threads/j-threads.html
线程的概念基本清楚, 关键是访问共享变量时, 一定要注意.
volatile: 对于简单变量, 使用 volatile 关键字就够了, 表示同步变量, 在多个线程中访问了 volatile时, 必须保证所有访问该变量的地方都使用了同步. 这个还是很有用的, 比如你开启了100个线程, 都在跑着, 而你想通过一个标记变量来关闭这些线程, 那么这个变量就可以实现.
线程的创建, 要么 extends Thread, 要么 实现 Runnable 接口
1. 通过继承 Thread 创建线程
2. 通过 Runnable 接口创建线程
此接口只有一个函数,run(),此函数必须由实现了此接口的类实现。但是,就运行这个类而论,其语义与前一个示例稍有不同, 我们可以用runnable 接口改写前一个示例。(不同的部分用黑体表示。)
请注意,当使用 runnable接口时,您不能直接创建所需类的对象并运行它;必须从 Thread类的一个实例内部运行它。许多程序员更喜欢runnable 接口,因为从Thread 类继承会强加类层次.
线程的启动, start()
线程的结束, run() 执行完了, 或者 抛出异常, 或者 另一个线程调用一个弃用的 stop() 方法. (stop方法已经不提倡使用)
加入线程, join()方法, 当调用 Thread.join()
时,调用线程将阻塞,直到目标线程完成为止。
休眠, 当前线程进入等待状态, sleep()方法, 直到过了一段时间, 或者 另一个线程对当前线程的 Thread 对象调用了 interrupt() 方法, 从而终端了这个等待的线程, 如果线程是由对 Thread.interrupt()的调用而终端的, 那么休眠的线程会抛出 InterruptedException, 这样线程就知道它是由中断唤醒的,就不必查看计时器是否过期.
Thread.yield() 同 sleep 一样, 它并不引起休眠,而只是暂停当前线程片刻,这样其它线程就可以运行了, 在大多数实现中,当较高优先级的线程调用 Thread.yield()
时,较低优先级的线程就不会运行.
同步: Synchronized
有两个重要含义:它确保了一次只有一个线程可以执行代码的受保护部分, 而且它确保了一个线程更改的数据对于其它线程是可见的.
锁: 每个 Java 对象都有一个相关的锁。同一时间只能有一个线程持有 Java 锁。当线程进入 synchronized
代码块时,线程会阻塞并等待,直到锁可用,当它可用时,就会获得这个锁,然后执行代码块.当控制退出受保护的代码块时, 即到达了代码块末尾或者抛出了没有在 synchronized块中捕获的异常时,它就会释放该锁。
创建 synchronized
块的最简单方法是将方法声明成 synchronized
。这表示在进入方法主体之前,调用者必须获得锁:
什么时候不需要同步
在某些情况中,您不必用同步来将数据从一个线程传递到另一个,因为 JVM 已经隐含地为您执行同步。这些情况包括:
- 由静态初始化器(在静态字段上或
static{}
块中的初始化器)初始化数据时 - 访问 final 字段时
- 在创建线程之前创建对象时
- 线程可以看见它将要处理的对象时
Java 多线程 (转)的更多相关文章
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
- Java多线程系列--“JUC锁”03之 公平锁(一)
概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
- Java多线程--让主线程等待子线程执行完毕
使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...
- Java多线程 2 线程的生命周期和状态控制
一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...
- java 多线程 1 线程 进程
Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报 分类: javaSE综合知识点(14) 版权声明:本文为博主原创文章,未经博 ...
- 一起阅读《Java多线程编程核心技术》
目录 第一章 Java多线程技能 (待续...)
- 第一章 Java多线程技能
1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...
- java从基础知识(十)java多线程(下)
首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...
随机推荐
- git 上传本地文件到github
git 上传本地文件到github 1 git config --global user.name "Your Real Name" 2 git config --global u ...
- greenplum集群安装
一.环境配置 1.地址分配 192.168.1.201 mdw master 192.168.1.202 sdw1 segment1 192.168.1.203 sdw2 segment2 2.创建用 ...
- AjaxPro 的基本用法
通过 Ajax可以直接访问后台的代码 实现的步骤: 一 ,添加 引用 AjaxPro.2.dll 文件 二 配置配置文件 <httpHandlers> <add verb=" ...
- js 判断某个对象是不是dom对象
<script type="text/javascript">//首先要对HTMLElement进行类型检查,因为即使在支持HTMLElement的浏览器中,类型却是有 ...
- 仿iOS底部弹出popUpWindow
上面为弹出来的效果 popUpWindow布局: <?xml version="1.0" encoding="utf-8"?> <Linear ...
- JDBC的批量处理数据
主要用到的方法有: preparedStatement.executeBatch();//积攒的数据执行 preparedStatement.clearBatch();//积攒的清除掉 prepare ...
- Maya Calendar 分类: POJ 2015-06-11 21:44 12人阅读 评论(0) 收藏
Maya Calendar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 70016 Accepted: 21547 D ...
- python-day7 python内置模块 面向对象
1.configparser模块 configparser用于处理特定格式的文件,其本质上是利用open来操作文件 # 注释1 ; 注释2 [section1] # 节点 k1 = v1 # 值 k2 ...
- uva 1025,城市的间谍
题目链接:https://uva.onlinejudge.org/external/10/1025.pdf 题意: 地铁是线性的,有n个站,编号(1~n),M1辆从左至右的车,和M2辆从右至左的车,发 ...
- CountDownLatch、CyclicBarrier和Semaphore
转载:http://www.cnblogs.com/dolphin0520/p/3920397.html 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDown ...