文件名称:
多线程及java5的线程并发库学习笔记:带PDF下载
开发工具:
文件大小: 939kb
下载次数: 0
上传时间: 2019-04-06
详细说明:NULL
博文链接:https://itway.iteye.com/blog/1539359WwW.nasu, corn
多线程及java5的线程并发库
创建线程的两种传统方式
第一种方式:在 Thread子类覆盖的run方法中编写运行代码
Thread thread1 new Thread()f
Override
public void run()i
While (true )t
try t
Thread. sleep(500);
3 catch (InterruptedException e)t
e printstackTrace;
System. out. printin (thread currentThread(. getName o);
System. out. println(this getName ());
thread1 start(
第二种方式:在传递给 Thread对象的 Runnable对象的run方法中编写代码
Thread thread2 new Thread (new Runnable t
Override
public void run()i
While(true
try t
Thread. sleep(2000)i
catch (InterruptedException e )i
e printstackTrace;
System. out. println(Thread currentThread ().getName ()
thread2 start o;
总结:查看 Thread类的run(方法的源代码,可以看到其实这两种方式都是在调用 Thread
对象的run方法,如果 Thread类的run方法没有被覆盖,并且为该 Thread对象设置了一个
Runnable对象,该run方法会调用 Runnable对象的run方法。
问題:如果在 Thread子类覆盖的run方法中编写∫运行代码,也为 Thread」类对象传递」
一个 Runnable对象,那么,线程运行时的执行代码是子类的run方法的代码?还是 Runnable
对象的run方法的代码?
交流社区http://bbs.naxsu.com交流群:125035597
Www.nasu, corn
多线程及java5的线程并发库
new Thread (new Runnable()i
public void runt
System, out. println (" run method of runnable!");
public void run)i
System. out. println("run method of thread! " )
fstart o;
输出结果是: run method of thread!
定时器的应用
package com. naxsu. thread;
import java. util. Timer;
import java. util. TimerTask
*定时器
Timer:提供对计时器 MBean的实现。
Timertask:由 Timer安排为一次执行或重复执行的任务。
10880毫秒执行第一次,接着每1888毫秒执行一次
public class TimerTest i
public static void main(String[] args)[
new Timer(.schedule(new TimerTaskoi
Override
public void runof
System, out. println(thread. current Thread. getName o)
},18989,1889);
线程的同步互斥与通信
不同线程同时对一份数据进行操作,就有可能出现线程安全问题
4交流社区:htt/ bbs. nasu. com交流群:125035597
Www.nasu, corn
多线程及java5的线程并发库
线程1
线程2
讲解 synchronized(obj的作用
主要是其中的。b的作用
b
1.a和b这两段代碼被两个线程执行时要互斥
宙需蒹的代码必须用 synchron1xc代n块包
3组置是
但c与
寸进入a和
线程3
线程4
中进行执行
4.用什么进行斥分
就是通过 synchronized
obj)中的o的不同
而分为不同的互斥组
线程互斥:
package com. nasu. thread;
x传统线程互斥技术
synchronized解解线程互斥问题的前提是不同线程共亨同一个锁
public class Tradition ThreadSynchronized t
public static void main(String[] args)i
new Tradition ThreadSynchronizedo.inito;
private void initoi
final Outputer outputer new Outputero;
new Thread (new Runnable((
Override
public void run()i
While (true)i
try i
Thread. sleep(10);
1 catch (InterruptedException e)t
e printstackTrace o;
outputer.output(www.naxsu.com")
3).start()
5交流社区;htp:/ bbs. nasu. com交流群:125035597
Www.nasu, corn
多线程及java5的线程并发库
new Thread ( new Runnable
pride
public void run ([
while (true)t
try i
Thread. sleep(10
3 catch (InterruptedException e)f
e printstackTrace o;
outputer. output( bbs. nasu. com");
tarto;
class outputer i
public void output (string name)i
int len= namelength(;
/使用 synchronized代码块解决线程安全问题,传入的参数是多线程调用的
同一个对象,上面两个细致入线程调用都是同一个 outputer对象(this)
synchronized (this)[
for (int i =0; i< len; i++)i
System. out. print (name charAt(1));
System. out. println()
/使用 synchronized方法解决线程安全问题
public synchronized void output2(String name)t
int len name length o;
for (int i=0; i< len; i++)t
System. out. print(name charAt(i));
System, out. printin(;
//在使静态方法 outpu3(此时类要变为: static c1 ass outputer)和普通方法
output同步, synchronized( outputer. class)
public static synchronized void output3(String name )i
int len namelength o;
for (int i =0; i< len; i++)t
System. out. print(name charAt(i));
6交流社区;htp:/ bbs. nasu. com交流群:125035597
Www.nasu, corn
多线程及java5的线程并发库
System. out. printIn(;
线程同步通讯
package com. nasu. thread
线程同步通讯
子线程循环18次,接着主线程循环188,接着又回到子线程循环18次,接着再回到主线
程又循坏188,如此循坏58次
public class TraditionalThread Communication i
ic static void main(Stringl] args)[
final Businessbusiness new Business
new Thread (new Runnable f
Override
public void runo i
for (int i =l; i<=50; i++)i
business. sub (i)
3).start(;
for (int i 1; 1 <=50; i++)i
business. main(i)j
//要用到共同数据(包括同步锁)的若干方法应该归在同一个类身上
lass Business i
private boolean bshouldsub true
public synchronized void sub(int i)i
while ( bShouldSub)i
try
/等待
this, wait(;
I catch (InterruptedException e)f
e, printstackTrace oj
交流社区http://bbs.naxsu.com交流群:125035597
Www.nasu, corn
多线程及java5的线程并发库
//子线程循环18次
for (int j
j<=10;j++){
System. out. println( "sub thread sequence of +j+",loop of +1);
bshouldsub false
//唤醒
this notify (
public synchronized void main(int i)i
While(bshouldSub)i
this waito;
catch (InterruptedException e)t
e,printStackTrace();
//主线程循环188
for(intj=1;j<=189;j++){
System. out. println("main thread sequence of +j+",loop of +i);
bShouldSub true;
this notify o;
8交流社区;htp:/ obs. nasu. com交流群:125035597
Www.nasu, corn
多线程及java5的线程并发库
线程范围内共享数据
线程1绑定的数据
对象与模块A
对象与模块日
对象与模块C
理
变量或
变里或
变量或
达式
表达式
表达式
线程2
线程2绑定的数据
线程沱围内共享数据的示意图
package com. nasu. thread;
import java.util. HashMap;
mport java util. Map;
import java. util. Random
*线程范围内共享数据
public class ThreadScope ShareData t
private static MapthreadData =new HashMap(;
public static void main(String[] args)[
//模拟两个线程
for (int i=0; 1<2; 1++)
new Thread(new Runnable(i
Override
public void run(i
int data new Random().nextInt o;
System. out. println(Thread currentThread ().getName()
+"has put data " +data
threadData. put(Thread. currentThreado, data)
new A(.geto;
new B(.geto;
Fstart;
9交流社区;htp:/ bbs. nasu. com交流群:125035597
Www.nasu, corn
多线程及java5的线程并发库
static class Af
public void get(f
int data threadData get(Thread. currentThreado)i
System. out. println("A from"+ Thread currentThread(. getNameo)
get data
data)
static class Bi
public void get(f
int data= threadData get(Thread. current Thread)
System. out. println( "B from"+ Thread currentThread(. getName(
+get data: t data);
Threadlocal实现线程范围的共享变量
每个线程调用全局 Threadloca对象的set方法,就相当于往其内部的map中增加一条
记录,key分别是各自的线程, value是各自的set方法传进去的值。在线程结束时可以调用
Threadlocal clear()方法,这样会更快释放内存,不调用也可以,因为线程结束后也可以自动
释放相关的 Threadloca|变量。
Threadloca|的应用场景
订单处理包含一系列操作:减少库存量、增加一条流水台账、修改总账,这几个操
作要在同一个事务中完成,通常也即同一个线程中进行处理,如果累加公司应收款
的操作失败了,则应该把前面的操作回滚,否则,提交所有操作,这要求这些操作
使用相同的数据库连接对象,而这些操作的代码分别位于不同的模块类中
银行转账包含一系列操作:把转出帐户的余额减少,把转入帐户的余额增加,这两
个操作要在同一个事务中完成,它们必须使用相冋的数据库连接对象,转入和转出
操作的代码分别是两个不同的帐户对象的方法。
例如 Strut2的 Action Context,同·段代码被不同的线程调用运行吋,该代码操作的
数据是每个线程各自的状态和数据,对于不同的线程来说, getContext方法拿到的
对象都不相同,对同一个线程来说,不管调用 getContext方法多少次和在哪个模块
中 getContext方法,拿到的都是同一个。
实现对 Threadlocal变量的封装,让外界不要直接操作 Threadlocal变量
对基本类型的数据的封装,这种应用相对很少见。
对对象类型的数据的封装,比较常见,即让某个类针对不同线程分别创建一个独立
的实例对象。
10交流社区:htt/ obs nasu. com交流群:125035597
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.