- 浏览: 1237298 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (193)
- ant/maven (6)
- algorithm (5)
- tomcat/weblogic/jboss (6)
- javascript/jquery (13)
- java (33)
- flex/flash (0)
- JPA/Hibernate/myBatis (18)
- java concurrent (7)
- test (2)
- windows/linux (6)
- java collection (7)
- design pattern (2)
- life/health (3)
- database (12)
- IDE (4)
- spring/ejb (20)
- html/css/ckeditor (7)
- jsp/servlet (3)
- java io (13)
- java security (4)
- jni (0)
- svn/git (2)
- english (2)
- java jmx (1)
- xml (1)
- struts/springmvc (9)
- middleware (2)
- cache (1)
- cglib (3)
最新评论
-
jlotusYo:
博主,真感谢。
Java 密码扩展无限制权限策略文件 -
senninha:
这个。。是api说明吧。。
ScheduledExecutorService 源码分析 -
zoutao2008:
请问大文件如何处理?按你这种方式的话,文件超过200M时就会报 ...
hessian系列之二:上传文件 -
lwj1113:
lwj1113 写道谢谢博主这么细致的demo;在系列五中通过 ...
myBatis系列之五:与Spring3集成 -
lwj1113:
谢谢博主这么细致的demo;在系列五中通过testng测试类跑 ...
myBatis系列之五:与Spring3集成
线程是程序的一个执行流程,Java虚拟机允许多个线程同时并发执行。
1. 构造方法
2. 线程启动
3. 任务执行
一般由JVM来调用该方法,也可以手动调用。
a. 如果子类覆盖了run()方法,则调用子类的run()
b. 如果a不成立:
b1. 指定了target,则调用target的run()
b2. 没有指定target,该方法不做任何事并返回
所以,下面MyThread的run方法会执行:
4. 清理工作
由系统来调用该方法,在线程退出之前清理分配的资源。
5. yield方法
使当前执行线程暂停一会,让其它线程得以执行。只是临时让出时间片,不会释放拥有的锁。
6. sleep方法
使当前执行线程休眠指定的时间,不释放持有的锁。
7. join方法
等待该线程执行,直到超时或者终止。
可以作为线程通信的一种方式:A线程调用B线程的join方法(阻塞),等待B完成后再往下执行。
8. 中断
9. 守护/普通进程
JVM有很多守护进程:如垃圾回收线程等。没有前台(Non-Daemon)线程时,JVM会退出。
10. 上下文类加载器
11. 线程的优先级
a. 线程的优先级在不同的系统平台上,对应的系统优先级会不同;可能多个优先级对应同一个系统优先级。
b. 优先级高的线程并不一定会优先执行,这个由JVM来解译并向系统提供参考。
12. 线程的状态
13. 未检查异常处理器
1. 构造方法
public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); } // target - 任务 public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); } // group - 线程组,target - 任务 public Thread(ThreadGroup group, Runnable target) { init(group, target, "Thread-" + nextThreadNum(), 0); } // name - 线程名称 public Thread(String name) { init(null, null, name, 0); } // group - 线程组,name - 线程名称 public Thread(ThreadGroup group, String name) { init(group, null, name, 0); } // target - 任务,name - 线程名称 public Thread(Runnable target, String name) { init(null, target, name, 0); } // group - 线程组,target - 任务,name - 线程名称 public Thread(ThreadGroup group, Runnable target, String name) { init(group, target, name, 0); } // group - 线程组,target - 任务,name - 线程名称, stackSize - 栈大小 // 这里的stackSize只是提供一个参考值,和平台相关,JVM根据情况会做适当的调整。 // stackSize大一些,线程就会不容易抛StackOverflowError。 // stackSize小一些,多个线程并发执行不容易抛OutOfMemoryError。 // 栈大小,最大递归深度和并发水平是和平台相关的。 public Thread(ThreadGroup group, Runnable target, String name, long stackSize) { init(group, target, name, stackSize); }
2. 线程启动
public synchronized void start() { if (threadStatus != 0 || this != me) throw new IllegalThreadStateException(); group.add(this); start0(); if (stopBeforeStart) { stop0(throwableFromStop); } } private native void start0();
3. 任务执行
一般由JVM来调用该方法,也可以手动调用。
a. 如果子类覆盖了run()方法,则调用子类的run()
b. 如果a不成立:
b1. 指定了target,则调用target的run()
b2. 没有指定target,该方法不做任何事并返回
public void run() { if (target != null) { target.run(); } }
所以,下面MyThread的run方法会执行:
public class MyThread extends Thread { public void run() { System.out.println("MyThread.run()"); } } new MyThread(new Runnable() { public void run() { System.out.println("Runnable.run()"); } }).start();
4. 清理工作
由系统来调用该方法,在线程退出之前清理分配的资源。
private void exit() { if (group != null) { group.remove(this); group = null; } target = null; threadLocals = null; inheritableThreadLocals = null; inheritedAccessControlContext = null; blocker = null; uncaughtExceptionHandler = null; }
5. yield方法
使当前执行线程暂停一会,让其它线程得以执行。只是临时让出时间片,不会释放拥有的锁。
public static native void yield();
6. sleep方法
使当前执行线程休眠指定的时间,不释放持有的锁。
public static native void sleep(long millis) throws InterruptedException; public static void sleep(long millis, int nanos) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos >= 500000 || (nanos != 0 && millis == 0)) { // 纳秒四舍五入,或者毫秒为0且纳秒不为0时 millis++; } sleep(millis); }
7. join方法
等待该线程执行,直到超时或者终止。
可以作为线程通信的一种方式:A线程调用B线程的join方法(阻塞),等待B完成后再往下执行。
public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (millis == 0) { // 0代表没有时间限制 while (isAlive()) { wait(0); // 无限期的等待 } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); // 有限期的等待 now = System.currentTimeMillis() - base; } } } public final synchronized void join(long millis, int nanos) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos >= 500000 || (nanos != 0 && millis == 0)) { // 纳秒四舍五入,或者毫秒为0且纳秒不为0时 millis++; } join(millis); } public final void join() throws InterruptedException { join(0); }
8. 中断
public void interrupt() { if (this != Thread.currentThread()) checkAccess(); synchronized (blockerLock) { Interruptible b = blocker; if (b != null) { interrupt0(); // Just to set the interrupt flag b.interrupt(); return; } } interrupt0(); } // 静态方法:查看当前线程是否中断,并且清除中断标志。 public static boolean interrupted() { return currentThread().isInterrupted(true); } // 查看该线程是否中断,但不清除中断标志。 public boolean isInterrupted() { return isInterrupted(false); } private native boolean isInterrupted(boolean ClearInterrupted);
9. 守护/普通进程
JVM有很多守护进程:如垃圾回收线程等。没有前台(Non-Daemon)线程时,JVM会退出。
public final void setDaemon(boolean on) { checkAccess(); if (isAlive()) { throw new IllegalThreadStateException(); } daemon = on; }
10. 上下文类加载器
public ClassLoader getContextClassLoader() { if (contextClassLoader == null) return null; SecurityManager sm = System.getSecurityManager(); if (sm != null) { ClassLoader ccl = ClassLoader.getCallerClassLoader(); // 调用者的类加载器 if (ccl != null && ccl != contextClassLoader && !contextClassLoader.isAncestor(ccl)) { // 调用者得类加载器不为空,且不和该线程的类加载器相同,也不是该类加载器的祖先时 sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION); } } return contextClassLoader; } public void setContextClassLoader(ClassLoader cl) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(new RuntimePermission("setContextClassLoader")); } contextClassLoader = cl; }
11. 线程的优先级
// 最小的优先级 public final static int MIN_PRIORITY = 1; // 正常的优先级 public final static int NORM_PRIORITY = 5; // 最大的优先级 public final static int MAX_PRIORITY = 10; public final void setPriority(int newPriority) { ThreadGroup g; checkAccess(); if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) { throw new IllegalArgumentException(); } if((g = getThreadGroup()) != null) { if (newPriority > g.getMaxPriority()) { newPriority = g.getMaxPriority(); } setPriority0(priority = newPriority); } }
a. 线程的优先级在不同的系统平台上,对应的系统优先级会不同;可能多个优先级对应同一个系统优先级。
b. 优先级高的线程并不一定会优先执行,这个由JVM来解译并向系统提供参考。
12. 线程的状态
public enum State { // 新建的线程,还没调用start()方法 NEW, // 可以运行,需要等到其它资源(如CPU)就绪才能运行 RUNNABLE, // 线程调用wait()后等待内置锁进入同步块或方法 BLOCKED, // 在调用无参的wait(),Thread.join()或LockSupport.lock()方法后进入等待状态 WAITING, // 调用Thread.sleep(), 有时间参数的wait(), 有时间参数的Thread.join(), LockSupport.parkNanos或LockSupport.parkUtil方法后进行有期限的等待状态 TIMED_WAITING, // 执行完毕的线程状态 TERMINATED; } public State getState() { // get current thread state return sun.misc.VM.toThreadState(threadStatus); }
13. 未检查异常处理器
public interface UncaughtExceptionHandler { void uncaughtException(Thread t, Throwable e); } private volatile UncaughtExceptionHandler uncaughtExceptionHandler; private static volatile UncaughtExceptionHandler defaultUncaughtExceptionHandler; // 设置线程默认的未检查异常处理器 public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission( new RuntimePermission("setDefaultUncaughtExceptionHandler") ); } defaultUncaughtExceptionHandler = eh; } public UncaughtExceptionHandler getUncaughtExceptionHandler() { return uncaughtExceptionHandler != null ? uncaughtExceptionHandler : group; } public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) { checkAccess(); uncaughtExceptionHandler = eh; } // 只由JVM调用 private void dispatchUncaughtException(Throwable e) { getUncaughtExceptionHandler().uncaughtException(this, e); }
发表评论
-
Netty系列之二、Netty组件
2014-10-12 19:55 0Netty主要由以下几个组件构成: Bootstrap o ... -
Netty系列之二:传输方式
2014-09-17 22:35 0NIO (Non-blocking I/O) io.netty ... -
Java正则表达式实例
2014-08-25 22:50 1888题目: 有两个文件context.txt和words ... -
quartz系列之九:存储
2014-08-05 13:16 0这里以1.8.x为例: 任务 ... -
JVM 四种引用
2014-04-24 19:56 17171. 强引用 指通过普通 ... -
Proxy 源码分析
2014-04-21 10:47 0public class Proxy implements ... -
NIO UDP 编程
2014-04-17 23:18 4205和TCP的SocketChannel类似,UDP的Dat ... -
Matcher 源码分析
2014-04-15 14:45 0首先看下接口: public interface Matc ... -
BTrace 使用
2014-03-20 18:03 0简介 Btrace (Byte Trace)是Sun推出的一款 ... -
NIO Socket 编程
2014-04-11 22:48 1603Java NIO (Nonblocking IO)解决了常规I ... -
hessian系列之二:上传文件
2014-02-17 17:16 6150hessian较早版本通过 byte[] 进行文件传输;4.0 ... -
hessian系列之三:与Spring集成
2014-02-17 20:21 17811Spring封装了hessian客户端和服务端的通用代码,把实 ... -
hessian系列之一:Hello world
2014-01-06 20:51 2254Hessian是一个Web Service的轻量级二进制协议, ... -
XStream:自定义转换器
2013-12-30 22:47 0XStream是一款不错的oxm (Object-XML ma ... -
Http连接工具类
2013-12-28 16:13 0public class HttpConnUtil { ... -
Integer源码分析
2013-12-26 19:59 0private static String toU ... -
全排序
2013-12-23 21:02 0写一个函数, 如 foo(String str), 打印出 s ... -
logback系列之四:输出日志到不同文件
2013-12-03 16:25 68755logback系列之一:输出日志到控制台 logback系列之 ... -
Properties 源码分析
2013-11-26 10:32 01. Properties类扩展了Hashtable,用来保存 ... -
logback系列之三:输出日志到文件(滚动)
2013-11-16 23:37 64265logback系列之一:输出日志到控制台 logback系列之 ...
相关推荐
由于上传大小限制,这是第一部份。要把part1,2,3一起下载并解压。
threadx 源码
2 架构分析 6 3 主要模块 9 3.1 Thread 9 3.2 Socket 11 3.3 TcpServer&TcpClient 11 3.4 Util 12 3.4.1 NotilceCenter 12 3.5 Extention 13 3.6 MediaSource 13 3.7 Pusher 14 3.8 Player 14 3.9 Session 15 3.10 ...
ThreadX是优秀的硬实时操作系统(RTOS),适用于深嵌入式应用中,具有规模小、实时性强、可靠性高、无产品版权费、易于使用等特点,并且支持大量的处理器和SoC...多线程实时操作系统ThreadX源码 使用说明, 非常适合于学习
本书共分为5个分卷,要完全下载 资料来源:大家网http://club.topsage.com 也可以去这下载全本:http://club.topsage.com/thread-2602632-1-1.html
程序分析:1.票数要使用同一个静态值 2.为保证不会出现卖出同一个票数,要java多线程同步锁。 设计思路:1.创建一个站台类Station,继承Thread,重写run方法,在run方法里面执行售票操作!售票要使用同步锁:即有一...
NIO客户端13 3.Netty源码分析16 3.1. 服务端创建16 3.1.1. 服务端启动辅助类ServerBootstrap16 3.1.2. NioServerSocketChannel 的注册21 3.1.3. 新的客户端接入25 3.2. 客户端创建28 3.2.1. 客户端连接辅助类...
java并发编程源码分析
程序猿学社的GitHub,欢迎Star ...本文已记录到github,形成...源码分析2.1 第一步,实现Callable接口2.2 FutureTask类结构图2.3 RunableFuture接口2.4 Runnable接口2.5 Future接口2.6 FutureTask源码分析后记 前言 通过上
java线程分析工具
先分析一些重要变量名接着分析5个函数,最后从main()函数分析,具体请看 //变量分析 char* Command;//命令行,比如你输入的“filedisk /umount r:” int DeviceNumber;//虚拟的盘数,比如 0-4个 char* FileName...
集合源码分析 java 实例来自from Oracle官方并发教程 Thread Objects 线程对象 #####定义并启动一个线程 任务:创建线程打印hello world com.oracle.sec2.thread_objects.HelloThread 定义并启动一个Actor也是很简单...
多线程,线程操作二三十个小功能项目,一步步学习线程知识。
Attach是什么 在讲这个之前,我们先来点大家都知道的东西,当我们感觉线程一直卡在某个地 方,想知道卡在哪里,首先想到的是进行线程...如下线程栈了 20140618 12:56:14 Full thread dump Java HotSpot(...
从源码的角度 对RT-thread实时操作系统的GUI组件进行分析
16:55:20.677 [main] INFO org.malin.allutils.makefile.ReadFileNameUtil - 获取到 文件名称: 11.jetty分析.pdf 16:55:20.677 [main] INFO org.malin.allutils.makefile.ReadFileNameUtil - 获取到 文件名称: 4....
本书共分为5个分卷,要完全下载 资料来源:大家网http://club.topsage.com 也可以去这下载:http://club.topsage.com/thread-2602632-1-1.html
本书共分为5个分卷,要完全下载 资料来源:大家网http://club.topsage.com 也可以去这下载:http://club.topsage.com/thread-2602632-1-1.html
本书共分为5个分卷,要完全下载 资料来源:大家网http://club.topsage.com 也可以去这下载完本:http://club.topsage.com/thread-2602632-1-1.html
本书共分为5个分卷,要完全下载 资料来源:大家网http://club.topsage.com 也可以去这下载完本:http://club.topsage.com/thread-2602632-1-1.html