- 浏览: 1124807 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (240)
- javascript (24)
- Struts (3)
- Hibernate (9)
- spring (3)
- 学海无涯 (45)
- jstl (4)
- java (21)
- js (4)
- Ajax (2)
- 开源框架-ajax (1)
- oracle spring (38)
- unix (6)
- 美国骆驼 American Camel 骆驼皮鞋 骆驼正品 (0)
- android (1)
- BIEE (16)
- informatica (13)
- 触摸屏 (1)
- 诈×骗×电话 (4)
- 远程桌面无法连接 (1)
- 旅游 (3)
- 生活 (8)
- hp6531s (2)
- oracle (6)
- 短信病毒 (1)
- 手机诈骗 短信病毒 (3)
- 骗子 (3)
- ultraedit (1)
- sql2008 (0)
- 苏宁易购大骗子 苏宁易购二手当新品卖 苏宁易购以次充好 苏宁易购您还敢下单吗 (0)
- 苏宁易购二手当新品卖 (0)
- informatica etl (5)
- etl (8)
- NoClassDefFoundError: com/opensymphony/xwork2/util/classloader/ReloadingClas (1)
- mysql (2)
- jquery ajax post (1)
- jason (1)
- json (1)
- struts2 (1)
- jsp 文本编辑器 (2)
- beyond compare (1)
- svn (3)
- EAS BOS (3)
- tapestry5 (1)
- obiee (3)
- java dll (2)
- office (1)
- kettle 8.2 org.gjt.mm.mysql.Driver (1)
最新评论
-
JianCaesar:
oracleStr2Clob,为什么要用反射,直接调用不可以吗 ...
java String和Clob转换 -
vip_gg:
...
邮件失败!javax.mail.AuthenticationFailedException: 535 Error: authentication -
cherryQQ:
我把敏感的用*号代替啦,这样可以了吧,等你加一个号,等着租房子 ...
**同城租房需要加房东的微*号 -
sam.sheng.3:
dream80 写道是的,这个主要就是二步验证的问题,很多人不 ...
AttributeError: can't set attribute -
ooo456mmm:
不错
oracle job 定时执行 存储过程
我看到过的好的帖子,转过来,有需要的朋友,可以参考
在新的JDK5.0中,对thread做了一些改进,我通过阅读一些资料写下了下面的总结,请大家看看。
1.创建线程
在java中实现多线程有两种方法,一个是直接继承Thread类,一个是实现Runnable接口,但是推荐的是第二种。因为在逻辑上应该要把一个线程要做的事情以及做这个事情的方法分开;对于Thread来讲,它只负责线程的操作,而具体要做的事情就应该放在Runnable中。但不管是那种方式,都要实现public void run()方法,但启动线程用start而不是run。
2.终止线程
在1.0中,可以用stop方法来终止,但是现在这种方法已经被禁用了,改用interrupt方法。interrupt方法并不是强制终止线程,它只能设置线程的interrupted状态,而在线程中一般使用一下方式:
while (!Thread.currentThread().isInterrupted() && more work to do)
{
do more work
}
而被block的线程在被调用interrupt时会产生InterruptException,此时是否终止线程由本线程自己决定。程序的一般形式是:
public void run()
{
try
{
. . .
while (!Thread.currentThread().isInterrupted() && more work to do)
{
do more work
}
}
catch(InterruptedException e)
{
// thread was interrupted during sleep or wait
}
finally
{
cleanup, if required
}
// exiting the run method terminates the thread
}
Thread.sleep方法也会产生InterruptedException,因此,如果每次在做完一些工作后调用了sleep方法,那么就不用检查isInterrupted,而是直接捕捉InterruptedException。
在捕捉到InterruptedException时,如果没有其他的事情可做,最好做一下处理,不能用{}
1)
void mySubTask()
{
. . .
try { sleep(delay); }
catch (InterruptedException e) { Thread().currentThread().interrupt(); }
. . .
}
或是
2)
void mySubTask() throws InterruptedException
{
. . .
sleep(delay);
. . .
}
3.线程状态
New:当使用new创建一个线程时
Runnable: 调用start或是从blocked状态出来时
Blocked:sleep, block on input/output, try to acquire lock, suspend, wait.
Dead: 运行完成或有exception产生。
4.线程优先级
可以设置线程优先级,但是不能保证高优先级的线程就会被先运行
5.线程组
可以把多个线程加到一个线程组里面去,这样可以对这些线程进行一些统一的操作,例如
ThreadGroup g = new ThreadGroup(groupName)
...
g.interrupt(); // interrupt all threads in group g
6.为Uncaught Exceptions设置Handlers
在java 5.0中,可以为线程中产生的unchecked exception设置一个处理器,这个处理器必须实现UncaughtExceptionHandler接口。
可以调用线程实例的setUncaughtExceptionHandler方法为每个线程设置一个处理器,也可以调用Thread.setDefaultUncaughtExceptionHandler来为所有的线程设置一个默认的处理器。如果没有给每一个线程设置处理器,那线程会首先使用线程组的处理器,如果还没有再使用默认的处理器。
7.Synchronization
多线程很重要的一个问题就是同步的问题,如果不解决好同步的问题一个是可能会引起数据的混乱,而且还有可能造成线程的死锁。在Java 5.0之前,用synchronized来解决这个问题,在5.0中加入了一个新的类:ReentrantLock
使用lock的基本形式是:
myLock.lock(); // a ReentrantLock object
try
{
critical section
}
finally
{
myLock.unlock(); // make sure the lock is unlocked even if an exception is thrown
}
这个锁被称为Reentrant的原因是在一个线程中可以重复多次申请同一个锁,系统会保留加锁的次数,而在解锁的时候也就必须执行相同次数。
在一个线程已经得到锁可以执行程序的时候,可能会发现需要的条件还不能满足,这时他就必须等待直到条件满足。但是因为它已经对所需要操作的东西加了锁,其他的线程不能访问,因此它又可能会永远等待下去。现在可以用Condition Object来避免这种情况。
sufficientFunds = bankLock.newCondition();
如果条件不满足:
sufficientFunds.await();
这时线程就会释放锁并进入blocked状态,其他线程就有机会执行操作。当其他线程执行完后,就可通知等待的线程继续执行它的操作了:
sufficientFunds.signalAll();
当然也可以调用singal方法,这样效率会高一些,但是有一定的危险性,因为它的唤醒具有随机性。
在5.0之前,采用的是synchronized关键字来进行同步,但是和lock相比它有一些局限性:
1. 申请锁的线程不能被interrupt
2. 没有timeout设置
3. 只有一个隐性的condition条件
另外,在申请锁的时候可以用tryLock方法,它会返回一个bool值来表示锁是否申请成功,如果没有成功,程序就可以做其他的事情了。
tryLock, await方法都可以被interrupt。
java.util.concurrent.locks包中提供了两种锁,一个就是ReentrantLock,另一个是ReentrantReadWriteLock,一般用于多操作远远多于写操作的时候:
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock();
8. Callables and Futures
实现多线程时一般用的是Runnable接口,但是他有一个问题就是他没有参数和返回值,所以当执行一个线程需要返回一个值的时候就不是很方便了。Callable接口和Runnable差不多,但是他提供了参数和返回值:
public interface Callable<V>
{
V call() throws Exception;
}
而Future接口可以保留异步执行的值:
public interface Future<V>
{
V get() throws . . .;
V get(long timeout, TimeUnit unit) throws . . .;
void cancel(boolean mayInterrupt);
boolean isCancelled();
boolean isDone();
}
FutureTask可以很方便的把Callable转换成Future和Runnable:
Callable<Integer> myComputation = . . .;
FutureTask<Integer> task = new FutureTask<Integer>(myComputation);
Thread t = new Thread(task); // it's a Runnable
t.start();
. . .
Integer result = task.get(); // it's a Future
9.用Executors创建线程池
用线程池有两个好处:1. 减少创建线程的开销。2. 控制线程的数量。
EXecutors提供了一些方法可以很方便的创建线程池:
newCachedThreadPool
New threads are created as needed; idle threads are kept for 60 seconds.
newFixedThreadPool
The pool contains a fixed set of threads; idle threads are kept indefinitely.
newSingleThreadExecutor
A "pool" with a single thread that executes the submitted tasks sequentially.
newScheduledThreadPool
A fixed-thread pool for scheduled execution.
newSingleThreadScheduledExecutor
A single-thread "pool" for scheduled execution.
在使用Executors时,先调用这些静态方法创建线程池,得到一个ExecutorService对象,然后用这个对象的submit方法提交你的Runnable或是Callable对象。
Future<?> submit(Runnable task)
Future<T> submit(Runnable task, T result)
Future<T> submit(Callable<T> task)
如果不再需要任何提交,就用shutdown方法来关闭线程池。
10.在界面中使用多线程
对于GUI设计来说,很重要的一个原则就是要及时的给用户反馈,就算是不能立即得到结果,界面也不能停在那里,是用户不知道发生了什么事情,必须让用户随时知道程序在坐什么。所以当程序要执行一段需要消耗比较长时间的操作时,就要使用多线程。
但是,有些界面控件并不是线程安全的,在使用这些控件时就要特别注意。在API doc中这些都有注明,使用的时候就可以查一下。
如果想在自己另外所创建的线程执行过程中随时更新界面来表示执行进程,要注意的一点是,这个线程并不能直接调用界面控件的方法,而要采用EventQueue类的invokeLater,invokeAndWait方法:
EventQueue.invokeLater(new
Runnable()
{
public void run()
{
label.setText(percentage + "% complete");
}
});
在新的JDK5.0中,对thread做了一些改进,我通过阅读一些资料写下了下面的总结,请大家看看。
1.创建线程
在java中实现多线程有两种方法,一个是直接继承Thread类,一个是实现Runnable接口,但是推荐的是第二种。因为在逻辑上应该要把一个线程要做的事情以及做这个事情的方法分开;对于Thread来讲,它只负责线程的操作,而具体要做的事情就应该放在Runnable中。但不管是那种方式,都要实现public void run()方法,但启动线程用start而不是run。
2.终止线程
在1.0中,可以用stop方法来终止,但是现在这种方法已经被禁用了,改用interrupt方法。interrupt方法并不是强制终止线程,它只能设置线程的interrupted状态,而在线程中一般使用一下方式:
while (!Thread.currentThread().isInterrupted() && more work to do)
{
do more work
}
而被block的线程在被调用interrupt时会产生InterruptException,此时是否终止线程由本线程自己决定。程序的一般形式是:
public void run()
{
try
{
. . .
while (!Thread.currentThread().isInterrupted() && more work to do)
{
do more work
}
}
catch(InterruptedException e)
{
// thread was interrupted during sleep or wait
}
finally
{
cleanup, if required
}
// exiting the run method terminates the thread
}
Thread.sleep方法也会产生InterruptedException,因此,如果每次在做完一些工作后调用了sleep方法,那么就不用检查isInterrupted,而是直接捕捉InterruptedException。
在捕捉到InterruptedException时,如果没有其他的事情可做,最好做一下处理,不能用{}
1)
void mySubTask()
{
. . .
try { sleep(delay); }
catch (InterruptedException e) { Thread().currentThread().interrupt(); }
. . .
}
或是
2)
void mySubTask() throws InterruptedException
{
. . .
sleep(delay);
. . .
}
3.线程状态
New:当使用new创建一个线程时
Runnable: 调用start或是从blocked状态出来时
Blocked:sleep, block on input/output, try to acquire lock, suspend, wait.
Dead: 运行完成或有exception产生。
4.线程优先级
可以设置线程优先级,但是不能保证高优先级的线程就会被先运行
5.线程组
可以把多个线程加到一个线程组里面去,这样可以对这些线程进行一些统一的操作,例如
ThreadGroup g = new ThreadGroup(groupName)
...
g.interrupt(); // interrupt all threads in group g
6.为Uncaught Exceptions设置Handlers
在java 5.0中,可以为线程中产生的unchecked exception设置一个处理器,这个处理器必须实现UncaughtExceptionHandler接口。
可以调用线程实例的setUncaughtExceptionHandler方法为每个线程设置一个处理器,也可以调用Thread.setDefaultUncaughtExceptionHandler来为所有的线程设置一个默认的处理器。如果没有给每一个线程设置处理器,那线程会首先使用线程组的处理器,如果还没有再使用默认的处理器。
7.Synchronization
多线程很重要的一个问题就是同步的问题,如果不解决好同步的问题一个是可能会引起数据的混乱,而且还有可能造成线程的死锁。在Java 5.0之前,用synchronized来解决这个问题,在5.0中加入了一个新的类:ReentrantLock
使用lock的基本形式是:
myLock.lock(); // a ReentrantLock object
try
{
critical section
}
finally
{
myLock.unlock(); // make sure the lock is unlocked even if an exception is thrown
}
这个锁被称为Reentrant的原因是在一个线程中可以重复多次申请同一个锁,系统会保留加锁的次数,而在解锁的时候也就必须执行相同次数。
在一个线程已经得到锁可以执行程序的时候,可能会发现需要的条件还不能满足,这时他就必须等待直到条件满足。但是因为它已经对所需要操作的东西加了锁,其他的线程不能访问,因此它又可能会永远等待下去。现在可以用Condition Object来避免这种情况。
sufficientFunds = bankLock.newCondition();
如果条件不满足:
sufficientFunds.await();
这时线程就会释放锁并进入blocked状态,其他线程就有机会执行操作。当其他线程执行完后,就可通知等待的线程继续执行它的操作了:
sufficientFunds.signalAll();
当然也可以调用singal方法,这样效率会高一些,但是有一定的危险性,因为它的唤醒具有随机性。
在5.0之前,采用的是synchronized关键字来进行同步,但是和lock相比它有一些局限性:
1. 申请锁的线程不能被interrupt
2. 没有timeout设置
3. 只有一个隐性的condition条件
另外,在申请锁的时候可以用tryLock方法,它会返回一个bool值来表示锁是否申请成功,如果没有成功,程序就可以做其他的事情了。
tryLock, await方法都可以被interrupt。
java.util.concurrent.locks包中提供了两种锁,一个就是ReentrantLock,另一个是ReentrantReadWriteLock,一般用于多操作远远多于写操作的时候:
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock();
8. Callables and Futures
实现多线程时一般用的是Runnable接口,但是他有一个问题就是他没有参数和返回值,所以当执行一个线程需要返回一个值的时候就不是很方便了。Callable接口和Runnable差不多,但是他提供了参数和返回值:
public interface Callable<V>
{
V call() throws Exception;
}
而Future接口可以保留异步执行的值:
public interface Future<V>
{
V get() throws . . .;
V get(long timeout, TimeUnit unit) throws . . .;
void cancel(boolean mayInterrupt);
boolean isCancelled();
boolean isDone();
}
FutureTask可以很方便的把Callable转换成Future和Runnable:
Callable<Integer> myComputation = . . .;
FutureTask<Integer> task = new FutureTask<Integer>(myComputation);
Thread t = new Thread(task); // it's a Runnable
t.start();
. . .
Integer result = task.get(); // it's a Future
9.用Executors创建线程池
用线程池有两个好处:1. 减少创建线程的开销。2. 控制线程的数量。
EXecutors提供了一些方法可以很方便的创建线程池:
newCachedThreadPool
New threads are created as needed; idle threads are kept for 60 seconds.
newFixedThreadPool
The pool contains a fixed set of threads; idle threads are kept indefinitely.
newSingleThreadExecutor
A "pool" with a single thread that executes the submitted tasks sequentially.
newScheduledThreadPool
A fixed-thread pool for scheduled execution.
newSingleThreadScheduledExecutor
A single-thread "pool" for scheduled execution.
在使用Executors时,先调用这些静态方法创建线程池,得到一个ExecutorService对象,然后用这个对象的submit方法提交你的Runnable或是Callable对象。
Future<?> submit(Runnable task)
Future<T> submit(Runnable task, T result)
Future<T> submit(Callable<T> task)
如果不再需要任何提交,就用shutdown方法来关闭线程池。
10.在界面中使用多线程
对于GUI设计来说,很重要的一个原则就是要及时的给用户反馈,就算是不能立即得到结果,界面也不能停在那里,是用户不知道发生了什么事情,必须让用户随时知道程序在坐什么。所以当程序要执行一段需要消耗比较长时间的操作时,就要使用多线程。
但是,有些界面控件并不是线程安全的,在使用这些控件时就要特别注意。在API doc中这些都有注明,使用的时候就可以查一下。
如果想在自己另外所创建的线程执行过程中随时更新界面来表示执行进程,要注意的一点是,这个线程并不能直接调用界面控件的方法,而要采用EventQueue类的invokeLater,invokeAndWait方法:
EventQueue.invokeLater(new
Runnable()
{
public void run()
{
label.setText(percentage + "% complete");
}
});
发表评论
-
您的电子密码器将于次日失效
2015-03-16 20:07 765今天收到一条短信 :发信息的是 95588 本 ... -
The capacity of each mail box should not exceed 2G foxmail本地邮箱满 foxmail本机邮箱满
2012-12-04 09:25 7091Foxmail客户端文件in.box和trash.box 超过 ... -
AttributeError: can't set attribute
2012-11-17 09:23 24453上次goAgent报错:AttributeError 按照b ... -
清源山 泉州清源山 清源山小路 清源山摩的 清源山摩的带路不靠谱
2012-11-05 12:44 1849清源山 泉州清源山 清源山小路 清源山摩的 清源山摩 ... -
-ERR [AUTH] Application-specific password required: http://support.google.co
2012-11-01 14:11 5177<!-- [if gte mso 9]><x ... -
不欠费销号也要缴保证金有么有 青海移动霸王条款 青海移动开户容易销户难,情何以堪啊
2012-07-18 14:00 1583由于来青海西宁长期出差,顺便就办了个青海移动的号码 ... -
您有一份快件已到达因地址不详细无法派送成功 骗人新招 小心中招
2012-06-08 10:05 3209一天前购买了一样东西 ,使用的是中国邮政,第二天就收 ... -
京东商城不要贪吃没有质量保障的服装这一笔羹毁掉了京东这个品牌
2012-05-22 09:41 1419前几天在京东商场买啦7条小内裤发现,同样均码的小内 在 ... -
NOKIA 手机旺旺 nokia 5230手机旺旺 手机旺旺软件下载
2011-11-14 11:27 1311塞班系统的手机客户,只要使用java 版本的手机 ... -
NOKIA 5230如何删除安装的软件
2011-11-13 23:06 1225今天安装啦一个塞班的(水果忍者)手机游戏,很垃圾,但是就是 ... -
无法打开internet站点,ie无法打开站点的解决方法【图解】
2011-10-27 16:07 3187无法打开internet站点 , ie无 ... -
02061178400 骚扰电话大家小心啊
2011-10-24 11:31 178302061178400 骚扰电话大家小心啊 ... -
做淘宝真的很辛苦哈,现在深有体会
2011-10-14 23:21 4美国骆驼 American Camel 骆驼皮鞋 骆驼正品 ... -
美国骆驼 American Camel 骆驼皮鞋 骆驼正品
2011-10-14 00:29 24今天新开通啦淘宝店铺:http://mycamel. ... -
来到渔具店里,发现我真的out啦
2011-06-10 18:13 1070来到渔具店里,发现我真的out啦 自从上完 ... -
如何安装惠普单个键盘
2011-05-23 10:39 1686刚刚换啦一个笔记本键盘 没有两天就掉了一个B 键盘盖子 ,怎么 ... -
NOKIA 5230安装QQ软件
2011-05-08 18:03 1185先把下载的QQ软件拷贝到存储卡里面新建一个文件夹,然后 功能 ... -
由于没有安装音量控制程序,Windows 无法在任务栏上显示音量控制
2010-11-30 18:54 13901、打开我的电脑 工具 文件夹选项 查看 隐藏已知文件类型 ... -
支付宝控件安装失败
2010-11-11 19:23 1364重新安装操作系统后,发现淘宝里面的支付宝控件安装失败,最 ... -
凡客一次不愉快的购物
2010-10-22 10:44 11052010-10-17在凡客购买衣服,18日开始发货,直到今天还 ...
相关推荐
java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。 2.数据批量导出。 3任务数据异步执行。 4.多线程...
JAVA使用线程池查询大批量数据
java多线程,对多线程,线程池进行封装,方便使用
java多线程并发查询数据库,使用线程池控制分页,并发查询。
用于数据量大的情况下预先查询出数据,加快对后面页面数据的查询速度
Java线程池及观察者模式解决多线程意外死亡重启问题,附件含两个要运行代码!
目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来模拟真实的QQ实时聊天软件。因为涉及到Socket编程,所以一定会使用多...
java多线程实现生产者和消费者 ,4种实现方式,分别为synchronizated,condition和lock,信号量,阻塞队列
刚学完多线程和线程池,以及线程爱好者。 使用场景及目标: 大文件的快速下载,经测试在100M带宽的网络下,下载一个40M的文件,不超过两秒钟,当然还得根据自己电脑的配置来讲。 其他说明: 文件如果特别小,而...
java简单分布式架构,多个数据源,线程池创建多线程访问数据库表,提高效率
java线程池的原理和实现,挺全面的,分享给大家!
在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉,通过此篇文章给大家分享Java多线程之多线程异常捕捉,需要的朋友可以参考下
* 使用多线程的好处: 1.降低消耗,减少了创建和销毁线程的次数,每个线程都可以重复利用,可执行多个任务 2.提高响应速度,任务可以不需要等到线程创建就可以立即执行 3.提高线程的可管理性,根据系统的承受能力,...
史上最强多线程面试44题和答案:线程锁+线程池+线程同步等
java多线程加队列上传文件_后台处理
主要介绍了Java多线程批量数据导入的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面小编和大家来一起学习下吧
线程池的多线程并发控制技术研究.caj 线程池的多线程并发控制技术研究.caj 线程池的多线程并发控制技术研究.caj
java线程池的源码分析以及各种池之间的对比;
JAVA线程池:让多线程编程更高效的魔法工具
java多线程扫描器,实现对任意主机端口的扫描