创建线程的两种传统方式
在Thread子类覆盖的run方法中编写运行代码
在传递给Thread对象的Runnable对象的run方法中编写代码
package cn.itcast.thread;
public class TraditionalThreadSynchronized {
/**
* @param args
*/
public static void main(String[] args) {
new TraditionalThreadSynchronized().init();
}
public void init(){
final Outputer outputer = new Outputer();
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("zhangxiaoxiang");
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("lihuoming");
}
}
}).start();
}
private static class Outputer {
//必须保证用同一个监视器对象,才能起到互斥作用
public void output(String name){
synchronized(Outputer.this){
int len = name.length();
for(int i = 0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
public synchronized void output2(String name){
int len = name.length();
for(int i = 0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
public static synchronized void output3(String name){
int len = name.length();
for(int i = 0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
}
new Thread(
new Runnable(){
public void run(){
System.out.println("run method of runnable!");
}
}
){
public void run(){
System.out.println("run method of thread!");
}
}.start();
总结:查看Thread类的run()方法的源代码,可以看到其实这两种方式都是在调用Thread对象的run方法,如果Thread类的run方法没有被覆盖,并且为该Thread对象设置了一个Runnable对象,该run方法会调用Runnable对象的run方法。
•涉及到的一个以往知识点:匿名内部类对象的构造方法如何调用父类的非默认构造方法。
实际应用:第二种,为什么?
第二种方式将代码封装到了一个对象中,更加符合 java面向对象编程的思想
多线程机制会提高程序的运行效率么?不会.运行效率可能会更低 线程切换之间会消耗资源.
为什么有多线程下载? 实际上是抢了服务器的带宽.计算机本身并没有变快,而是让服务器提供了更多的服务.
定时器的应用:
Timer类
TimerTask类
可以借助quartz控制具体的实现:
Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron-like表达式等等。
你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行。一个自动执行而无须干预的任务在执行过程中如果发生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用Java编程吗?如果这些问题中任何一个你回答是,那么你应该使用Quartz调度器。
旁注:Matrix目前就大量使用到了Quartz。比如,排名统计功能的实现,在Jmatrix里通过Quartz定义了一个定时调度作业,在每天凌晨一点,作业开始工作,重新统计大家的Karma和排名等。
还有,RSS文件的生成,也是通过Quartz定义作业,每隔半个小时生成一次RSS XML文件。
线程之间的互斥与通讯:
1. 互斥: 用synchronized(object){ } 代码块(需要保证object是一个)或者在方法上加synchronized关键字
package cn.itcast.thread;
public class TraditionalThreadSynchronized {
/**
* @param args
*/
public static void main(String[] args) {
new TraditionalThreadSynchronized().init();
}
public void init(){
final Outputer outputer = new Outputer();
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("zhangxiaoxiang");
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("lihuoming");
}
}
}).start();
}
private static class Outputer {
//必须保证用同一个监视器对象,才能起到互斥作用
public void output(String name){
synchronized(Outputer.this){
int len = name.length();
for(int i = 0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
public synchronized void output2(String name){
int len = name.length();
for(int i = 0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
public static synchronized void output3(String name){
int len = name.length();
for(int i = 0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
}
2.线程间的通讯
eg: 子循环先运行10次,然后主循环运行100次,然后回到子循环10次.如此循环50次
public class ThreadTest {
public static void main(String[] args) {
stubnew ThreadTest().init();
}
public void init() {
final Business business = new Business();
new Thread(new Runnable() {
publicvoid run() {
for(int i=0;i<50;i++) {
business.SubThread(i); } } } ).start();
for(int i=0;i<50;i++) { business.MainThread(i); }
}
private class Business {booleanbShouldSub = true;//这里相当于定义了控制该谁执行的一个信号灯
public synchronized void MainThread(int i) {
if(bShouldSub)
try {
this.wait();
} catch (InterruptedException e)
{// TODO Auto-generated catch block
e.printStackTrace();
}
for(int j=0;j<5;j++) {
System.out.println(Thread.currentThread().getName() + ":i=" + i +",j=" + j); }
bShouldSub = true;this.notify(); }
public synchronizedvoid SubThread(int i)
{
if(!bShouldSub)
try {this.wait();
} catch (InterruptedException e) {// TODO Auto-generated catch block
e.printStackTrace();
}
for(int j=0;j<10;j++) {
System.out.println(Thread.currentThread().getName() + ":i=" + i +",j=" + j); }
bShouldSub = false; this.notify(); }
}}
分享到:
相关推荐
资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...
java并发库thread使用,传统线程技术、定时器技术、线程互斥技术,同步通讯技术、多线程共享数据、并发库应用,线程锁技术,阻塞锁、阻塞队列,线程池等应用
本章主要介绍waitO、 notify All()和notify()方法的使用, 使线程间能互相通信, 合作完成任务。 本章还介绍了Thread Local类的使用。 学习完本章, 读者就能在Thread多线程中进行数据的传递了。4.讲解了...
本文实例讲述了C#线程执行超时处理与并发线程数控制的方法。分享给大家供大家参考。具体实现方法如下: 特别说明: 1、为了测试方便,这里对存储过程的执行是模拟的 2、这里限制了并发执行存储过程的最大个数,但并...
4.线程间通信:lock、condition、wait、notify、notifyAll 5.Lock-free:atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList 6.关于锁的经验介绍 7.并发流程控制手段:CountDownLatch、Barrier 8.定时器:...
4、线程间的协调手段:lock、condition、wait、notify、notifyAll☆☆☆ 5、Lock-free: atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList☆☆☆ 6、关于锁使用的经验介绍 7、并发流程控制手段:...
4、线程间的协调手段:lock、condition、wait、notify、notifyAll ☆ ☆ ☆ 5、Lock-free: atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList ☆ ☆ ☆ 6、关于锁使用的经验介绍 7、并发流程控制手段:...
4、线程间的协调手段:lock、condition、wait、notify、notifyAll☆☆☆ 5、Lock-free: atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList☆☆☆ 6、关于锁使用的经验介绍 7、并发流程控制手段:...
co_loop/co_poll/co_ioservice 封装epoll/kqueue的高并发异步IO框架:支持tcp, udp和其他fd的异步IO。 co_routineex 整合上面的协程库以及异步IO框架,实现“同步”的读写。 co_dnsutils DNS解析函数 其他 co_...
Timer继承子Thread类,是Thread的子类,也是线程类,具有线程的能力和特征。这个类用来定义多久执行一个函数。 它的实例是能够延迟执行目标函数的线程,在真正执行目标函数之前,都可以cancel它。 Timer源码: ...
(创建和获取状态)2.1 在执行工作前调用一次 `代理智能提取_创建()` (比如: `启动按钮_被单击`)2.2 你可以搞个时钟/定时器来刷新代理智能提取模块的工作状态2.3 当你打算结束工作/工作完毕时记得执行 `代理智能...
SnsSharp 功能: 一、 文件读写 1、 支持 Txt、 Ini、 Bin、 Xml ...2、 多线程, 支持多线程并发处理, 适用于执行比较耗时的功能。 五、图像显示控件,可缩放平移图像,可方便绘制矩形框。 六、全局鼠标键盘事件响应
使用线程实现的简单易用的定时器。 信号量。 线程组。 简单易用的线程池,可以异步或同步执行任务,支持functional 和 lambad表达式。 工具库 文件操作。 std::cout风格的日志库,支持颜色高亮、代码定位、异步打印...
编写程序,演示多进程并发执行和进程软中断、管道通信。 父进程使用系统调用pipe( )建立一个管道,然后使用系统调用fork()创建两个子进程,子进程1和子进程2; 子进程1每隔1秒通过管道向子进程2发送数据: I send you...
- 为充分利用多核CPU的性能,以多线程的形式实现服务器,并实现线程池避免线程频繁创建销毁造成的系统开销 - 实现基于小根堆的定时器,用于断开超时连接 - 实现可以自动增长的缓冲区,作为HTTP连接的输入和输出缓冲...
在写了内核链表后,写了这段代码,以便自己和他人易于理解和使用链表。
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...
Handler 是用来干什么的?...出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题。为了解决这个问题,Android制定了一条简单的规则:只允许U
目前提供的green化的io对象包括: tcp socket file descriptor timer(定时器,待支持) signal(信号,待支持)chan:协程间通信 每个协程是一个独立的执行单元,为了能够方便协程之前的通信/同步,coroutine_event...