没有合适的资源?快使用搜索试试~ 我知道了~
传智播客学习笔记 New Timer().schedule(new MyTimerTask(),2000+2000*count) ExecutorService threadPool=Executors.newSingleThreadExecutor();
资源推荐
资源详情
资源评论
第一讲
1)、 Thread thread=new Thread();
Thread.start();
方法会调用 thread 的 run 方法。因此通过继承 Thread 类来重写 run 方法。
Thread.currentThread().getName();//获得当前正在执行的线程名称。
2)、创建一个 Runnable,作为 new Thread()的参数,来执行 Runnable 中的 run 方法。
Runnable 代码线程要运行的宿主。
第 2 讲
定时器 Timer 类和 TimerTask 类
New Timer().schedule(new TimerTask(){
Public void run(){
//执行
}
},10000,3000);//第二个参数为 10 秒
注:10 秒后启动定时任务,以后每隔 3 秒再次执行一次
New Timer().schedule(new MyTimerTask(),2000);
Class MyTimerTask extends TimerTask{
Public void run(){
System.out.println(“hello”);
New Timer().schedule(new MyTimerTask(),2000);
}
}
上面的代码会每隔 2 秒都会在执行。
New Timer().schedule(new MyTimerTask(),2000);
Class MyTimerTask extends TimerTask{
Static int count=0;
Public void run(){
Count=(count+1)%2;
System.out.println(“hello”);
New Timer().schedule(new MyTimerTask(),2000+2000*count);
}
}
实现 2 秒和 4 秒间交替执行
开源工具:quartz 实现定时器。
第 3 讲
线程的互斥和同步问题
Class Outputer(){
Public void output(String name){
Int len=name.length();
For(int i=0;i<length;i++){
System.out.println(name.charAt(i));
}
System.out.println();
}
}
Main(){
Outputer outputer=new Outputer();
//第一个线程
New Thread(new Runnable(){
Public void run(){
While(true){
Try{
Thread.sleep(10);
}
Catch(Exception e){
}
Outputer.output(“hello”);
}
}
}).start();
//第二个线程
New Thread(new Runnable(){
Public void run(){
While(true){
Try{
Thread.sleep(10);
}
Catch(Exception e){
}
Outputer.output(“world”);
}
}
}).start();
}
注:外部类不能静态方法不能 new 内部类的实例。原因是,内部类能访问外部类的成员变
量,如果在静态方法中 new 出了内部类,此时外部类还没有实例化,内部类就没办法访问
外部类的成员变量了。矛盾,所以不能再静态方法中 new 出内部类的实例。
问题:上面启动了两个线程,就有可能在输出低一个线程的内容时,被中断,开始输出第
二个线程的输出内容。
可以在排他性的代码上夹 synchronized 关键字
Class Outputer(){
Public void output(String name){
Int len=name.length();
Synchronized(name){
For(int i=0;i<length;i++){
System.out.println(name.charAt(i));
}
System.out.println();
}
}
}
错误:任何一个变量都可以当做互斥的钥匙,但这个钥匙必须是在多个线程间公用的,否
则无法起到互斥的作用,以上的方法是错误的。而在上面的代码中,线程直接使用的不是
同一个 name 变量。
第一个线程和第二个线程都在使用 output 对象,因此可以对 output 对象上加锁
Class Outputer(){
Private String temp=””;
Public void output(String name){
Int len=name.length();
Synchronized(temp){//或者使用 this 关键字
For(int i=0;i<length;i++){
System.out.println(name.charAt(i));
}
System.out.println();
}
}
}
注:锁住该类的成员变量,就相当于锁住了对象本身,当然也可以是 this 关键字。
在方法上添加 synchronized 关键字。
Class Outputer(){
Public synchronized void output(String name){
Int len=name.length();
For(int i=0;i<length;i++){
System.out.println(name.charAt(i));
}
System.out.println();
}
}
在成员方法上添加 synchronized,相当于把这个对象给锁住了。
一个内部类使用 static 修饰,就相当于一个外部类
Class Outputer(){
Public void output1(String name){
Synchronized(this){//或者使用 this 关键字
For(int i=0;i<length;i++){
System.out.println(name.charAt(i));
}
System.out.println();
}
}
Public static synchronized void output2(String name){
Int len=name.length();
For(int i=0;i<length;i++){
System.out.println(name.charAt(i));
}
System.out.println();
}
}
错误:外部分别调用该对象的 output1()和 output2()是不能实现同步的。
修改 output1()方法,使用类的字节码对象 Outputer.class
Class Outputer(){
Public void output1(String name){
Synchronized(Outputer.class){//或者使用 this 关键字
For(int i=0;i<length;i++){
System.out.println(name.charAt(i));
}
System.out.println();
}
}
Public static synchronized void output2(String name){
Int len=name.length();
For(int i=0;i<length;i++){
System.out.println(name.charAt(i));
}
System.out.println();
}
}
第 4 讲
实例:子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再
回到主线程又循环 100 次。如此循环 50 次。
分析:主线程和子线程是互斥的。
Class TraditionalThreadCommunication{
Public static void main(String[] args){
New Thread(
New Runnable(){
Public void run(){
for(int j=1;j<=50;j++){
Synchronized(TraditionalTreadCommunication.class){
For(int i=1;i<=10;i++){
System.out.println(“sub tread sequence of “+i);
}
}
}
}
}
).start();
//主线程运行
for(int j=1;j<=50;j++){
Synchronized(TraditionalTreadCommunication.class){
For(int i=1;i<=100;i++){
System.out.println(“main tread sequence of “+i);
}
}
}
}
}
注:需要保护的运行代码是第二层的 for 循环,因此,在第二次的 for 循环外使用关键字
synchronized 保护起来。另外,主线程和子线程直接需要互斥,两者的锁必须相同,因此使
用字节码作为锁,TraditionalThreadSynchronized.class
改进:
Class Bussiness{
//通信的变量
Private boolean bShouldSub=true;
Public synchronized void sub(){
//If(!bShouldSub){
While(!bShouldSub)
This.wait();
}
For(int i=1;i<=10;i++){
System.out.println(“sub tread sequence of “+i);
}
剩余33页未读,继续阅读
资源评论
沧浪之鱼
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 全球干旱数据集【自校准帕尔默干旱程度指数scPDSI】-190101-202312-0.5x0.5
- 基于Python实现的VAE(变分自编码器)训练算法源代码+使用说明
- 全球干旱数据集【标准化降水蒸发指数SPEI-12】-190101-202312-0.5x0.5
- C语言小游戏-五子棋-详细代码可运行
- 全球干旱数据集【标准化降水蒸发指数SPEI-03】-190101-202312-0.5x0.5
- spring boot aop记录修改前后的值demo
- 全球干旱数据集【标准化降水蒸发指数SPEI-01】-190101-202312-0.5x0.5
- ActiveReports
- vgbvdsbnjkbfnb
- effsefefeffsfwfse
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功