原文:http://blog.csdn.net/qjyong/archive/2009/09/14/4552701.aspx
1.
进程:正在运行程序
线程:程序中某条执行路径.
多进程:OS允许同时执行多程序.
多线程:程序允许同时执行多线程.
进程:有独立数据空间,切换效率低.
线程:共享进程数据空间,切换效率高.
2.创建线程
1)Runnable (推荐)
2)继承Thread
单cpu没有真正意义的执行多线程,cpu采用分时间片或抢占模式执行线程.
一个时刻只有一个执行线程,轮换时间短(可认为并发).
a)抢占式:获取分配时间片,激活线程,用完后以优先级抢占(优先级确定)
b)手机:协作式,不分时间片,yield,阻塞,等待才失去控制
3.jdk1.5以后定义为6种状态,(getState())
1) NEW
2) RUNNABLE(start后处于可运行,不一定正在运行)
3) TERMINATED
4) BLOCKED
5) WAITING
6) TIMED_WAITING
3.1阻塞的切换
a)试图获取内部对象锁,被其他占用,该线程阻塞(索取资源) blocked
b)等待一个线程通知调度器一个条件(系统安排),等待waiting
Object.wait Thread.join java.util.concurrent.Lock
java.util.concurrent.Condition
c)超时参数,调用进入time waiting,将保持超时期满或接收到通知
Thread.sleep
Object.wait Thread.join
java.util.concurrent.Lock.tryLock
java.util.concurrent.Condition.await
3.2终止(stop过时)
a)正常run接收
b)没有捕获异常
4.调度
sleep yield join(等待终止进程) wait notify() notifyAll()
5.中断
1)run正常结束
2)在sleep(),用interrupt()抛出异常
3)抛出异常
6.优先级(1-10) 默认5 NORM_PRIORITY
7.同步
8.其他线程获得机会
a)AWT的事件分派线程将一直并行运行,处理用户事件
b)比较耗时的任务应使用独立线程
9.每个任务占用一个线程,不推荐,推荐线程池
10.run执行同一线程,start(启动新线程,执行run)
11.中断线程 执行run最后一句,返回,或出未捕获异常
Thread.currentThread.isInterrupted 判断中断
b)阻塞线程(sleep,wait)线程无法检测中断,调用interrupt会被InterruptException中断
(阻塞I/O不能中断)
c)先interrupt后sleep也会抛出InterruptException中断
d)可自定义中断处理方式,不一定终止
12.isInterrupted实例方法 interrupted static方法会清楚中断状态
13.InterruptException中断处理
a) catch中中断 Thread.currentThread().interrupt();
b)抛出
public class BallTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {// EventQueue
public void run() {
JFrame frame = new BounceFrame();// frame
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class BounceFrame extends JFrame {
private static final long serialVersionUID = 1L;
private BallComponent comp;
public static final int DEFAULT_WIDTH = 450;
public static final int DEFAULT_HEIGHT = 350;
public static final int STEPS = 1000;
public static final int DELAY = 30;
public BounceFrame() {
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
setTitle("Bounce");
comp = new BallComponent();// component
add(comp, BorderLayout.CENTER);
Panel buttonPanel = new Panel();// panel
addButton(buttonPanel, "Start", new ActionListener() {// button
public void actionPerformed(ActionEvent e) {
addBall();// 事件监听
}
});
addButton(buttonPanel, "Close", new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);// 关闭
}
});
add(buttonPanel, BorderLayout.SOUTH);
}
/**
* 添加按钮
*
* @param buttonPanel
* @param string
* @param actionListener
*/
public void addButton(Container c, String title, ActionListener actionListener) {
JButton button = new JButton(title);
c.add(button);
button.addActionListener(actionListener);
}
/**
* 添加balls
*
*/
protected void addBall() {
final Ball ball = new Ball();
comp.add(ball);
Thread t = new Thread(new Runnable() {
public void run() {
for (int i = 1; i <= STEPS; i++) {
ball.move(comp.getBounds());
comp.paint(comp.getGraphics());// 一般调用awt的repaint,然而addBall完全掌握控制权
try {
Thread.sleep(DELAY);
} catch (InterruptedException e) {
e.printStackTrace();
}// 抛出InterruptedException 中断异常
}
}
});
t.start();
}
}
class Ball {
private static final int XSIZE = 15;
private static final int YSIZE = 15;
private double x = 0;
private double y = 0;
private double dx = 1;
private double dy = 1;
public Ellipse2D getShape() {
return new Ellipse2D.Double(x, y, XSIZE, YSIZE);
}
/**
* @param bounds
*/
public void move(Rectangle bounds) {
x += dx;
y += dy;
if (x < bounds.getMinX()) {
x = bounds.getMinX();
dx = -dx;
}
if (x + XSIZE >= bounds.getMaxX()) {
x = bounds.getMaxX() - XSIZE;
dx = -dx;
}
if (y < bounds.getMinY()) {
y = bounds.getMinY();
dy = -dy;
}
if (y + YSIZE >= bounds.getMaxY()) {
y = bounds.getMaxY() - YSIZE;
dy = -dy;
}
}
public void mode(Rectangle2D bounds) {// ??
}
}
class BallComponent extends JPanel {
private ArrayList<Ball> balls = new ArrayList<Ball>();
public void add(Ball b) {
balls.add(b);
}
/*
* (non-Javadoc)
*
* @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
*/
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (Ball b : balls) {
((Graphics2D) g).fill(b.getShape());// 绘制球
}
}
}
14.线程优先级 默认继承父类优先级
线程优先级依赖于系统(被映射) windows7个 linux在虚拟机被忽略
15.yield 静态方法,线程将让步
16.守护进程 t.setDaemon(true);为其他线程服务
a)只剩守护进程,虚拟机退出
b)守护进程永远不访问固定资源(文件,数据库),因为可能在任何时候中断
c)线程启动前调用
17.未捕获异常处理器,不被捕获的异常导致线程终止
1)将未捕获异常写到日志
static void setDefaultUncaughtExceptionHandler
setUncaughtExceptionHandler
2)未安装处理器的,处理器为ThreadGroup对象UncaughtExceptionHandler
a)如该组有父线程组,父线程组的方法调用
b)否则,Thread.getDefaultExceptionHandler非空,调用
c)否则,Throwable是ThreadDeath的实例,什么都不做
d)否则,线程名,Throwable栈被输出System.err
18.同步 race condition 竞争条件
javap -c -v Bank
1) ReenttrantLock
ReenttrantLock(boolean) 带公平策略(偏爱等待长的,效率低)
private Lock bankLock=new ReenttrantLock();
mylock.lock();
try{
//
}finally{
mylock.unlock();
}
a)同一锁对象,串行运行
b)不同锁对象,互不干扰
c)可重复获得已经持有的锁,锁有个持有计数
2)条件变量 保证操作的一致性(管理进入保护区,还不能运行的)
private Condition suf=bankLock.newCondition();
while(!){
suf.await();//等待锁 ,可能死锁,无人唤醒
}
suf.singalAll();//激活-可运行-调度-等待获得锁-返回继续执行(当出现有利条件时)
(,当锁可用,不能马上解除阻塞)
singal() 随机
a)只能有一个线程执行保护代码
b)条件对象管理进入保护区但还不能运行的Thread
3)synchronized 方法获得对象锁(只有一个条件 wait notifyAll--只能在同步块中
为Object的final方法)
a)静态同步方法被调用,对象锁被锁住,方法不能被调用
b)单一条件可能不够,获取锁不超时,不能中断企图获得锁线程
4)同步阻塞
synchronized(lock)
synchronized(account)//对象锁 account有内部锁,不被修改,不建议
19.监视器
a)只有私有域
b)其对象有相关锁
c)锁对所有方法加锁(调用前自动添加,后自动释放)
d)可有多个条件
e)synchronized声明方法
f)每个条件独立管理一个线程集
g)java每个对象有个内部的锁和条件
20.问题
a)多核同一地方存储值不同
b)内存存储值不同
锁机制
1)必要时候刷新本地缓冲
2)不能不正当的重新排序指令
内部锁对象锁重叠引起阻塞
1)可用volatile
private volatile boolean done;
2)AtomicBoolean 提供原子性(不用锁) java.util.concurrent.atomic
域安全
1)final
2)访问由公有锁保护
3)violate
jconsole
等待获得锁
a)myLock.lock()//可能获得锁的时候中断
myLock.tryLock();//若被中断抛出InterruptedException,打破死锁
lockInterruptibly //超时无限
b)awaitUninterruptibly//不可中断
等待超时,singal 中断
分享到:
相关推荐
掌握这些基础概念和规则是学习Core Java的起点,随着深入学习,还将涉及异常处理、输入/输出、集合框架、多线程、网络编程等更多内容。对于初学者来说,理解并熟练运用这些知识是成为Java程序员的第一步。
10. **多线程**:理解并发编程的基本概念,包括线程的创建、同步和协作,以及线程池的使用。 11. **事件驱动编程**:在GUI编程中,了解事件模型和监听器接口,用于用户界面的交互。 12. **IO/NIO**:学习Java的...
《Core Java 1 第十版》是Java编程领域的一本经典教材,专注于Java核心技术的讲解。这本书详尽地涵盖了Java语言的基础以及高级特性,对于学习和掌握Java编程有着极高的价值。以下是根据书名和描述提炼出的一些核心...
第二卷则深入到高级主题,如多线程、网络编程、I/O流、数据库访问以及JavaFX图形界面开发等。 在提供的压缩包文件中,我们看到了四个版本的随书源码,分别是`corejava9.zip`、`corejava8.zip`、`corejava.zip`和`...
4. **多线程**: - **线程的创建**:通过Thread类或实现Runnable接口创建线程。 - **同步机制**:synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和相关实现如ReentrantLock。 - **线程池*...
《CoreJava课件》是一份...通过这十四章的学习,你将能够熟练掌握CoreJava的核心知识,为后续的Java EE开发或Android开发奠定坚实的基础。这份课件不仅适合初学者,也是经验丰富的开发者回顾和巩固基础知识的宝贵资料。
6. **多线程编程**:Java支持并发编程,书中会讲解如何创建和管理线程,以及同步和互斥的概念,如synchronized关键字和wait/notify机制。 7. **网络编程**:Java SE提供了Socket编程接口,可以用于构建网络应用程序...
10. **多线程**:Java内置了对多线程的支持,通过Thread类或实现Runnable接口创建线程,以及synchronized关键字、wait()和notify()方法进行线程同步。 11. **网络编程**:Java提供了丰富的Socket类和ServerSocket类...
6. **多线程编程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口、synchronized关键字、volatile属性以及线程池。这部分内容对于开发高性能、高并发的应用至关重要。 7. **输入/输出流**:Java的I/O流...
**标题:“CoreJava(第六章)”** 在Java编程领域,Core Java是指Java语言的基础部分,不涉及特定的应用框架或库。第六章通常会涵盖高级Java特性或者特定主题,但未提供具体的章节标题,我们可以通过常见Java教程的...
10. **第10章:线程与并发编程** - 线程的基本概念 - 同步机制与死锁问题 11. **第11章:图形用户界面编程** - Swing组件库介绍 - AWT与Swing的比较 12. **第12章:网络编程** - Socket编程模型 - HTTP...
标题 "CoreJava(第二章)" 暗示我们即将探讨的是关于Java编程语言的核心概念,主要聚焦在第二章的内容。通常,"Core Java"涵盖Java的基础语法、类、对象、接口、异常处理、集合框架、多线程、输入/输出(I/O)以及网络...
1. **多线程编程**:讲解线程的创建、同步、并发工具,如synchronized关键字、volatile变量和java.util.concurrent包中的类。 2. **网络编程**:介绍套接字编程、HTTP协议,以及如何使用Java进行网络通信。 3. **...
《Core Java Volume I+II 10th Edition》是Java编程领域的经典教材,全面深入地讲解了Java的核心技术。这套书分为两卷,第一卷主要介绍基础,第二卷则涉及高级特性。以下是对这两个部分的一些关键知识点的详细阐述:...
8. **并发编程**:涵盖线程、同步机制(synchronized关键字、Lock接口)、并发集合(如ConcurrentHashMap)以及ExecutorService和Future接口,帮助开发者编写高效且安全的多线程程序。 9. **反射API**:解释如何在...
Java支持多线程编程,本章将讲解线程的创建、状态转换、同步与通信,以及线程池的使用。 第九章:反射与注解 反射机制允许在运行时动态地获取类的信息并操作对象,而注解是元数据的一种形式,用于提供编译时或运行...
标题“CoreJava(第七章)”暗示我们即将探讨的是关于Java编程语言的一个特定章节,通常在技术书籍或教程中,每一章都会专注于一个特定的主题或概念。在这个情况下,由于没有具体的章节名称,我们可以假设这将涵盖Java...