- 浏览: 153903 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lanhaitun1991:
亲,其实你这里介绍的方法有一个最大的问题:如果放入队列之后,但 ...
分布式事务 -
lp385267935:
不错 很好用~3Q
jsonlib json-->object,忽略object中没有的属性 -
xiebo1983:
http://www.sqkoo.com/show/detai ...
mysql latin1乱码 -
envy2002:
当然可以了,tomcat中源码你可以看看,只要“欺骗”过去to ...
tomcat中的长连接 -
newSaa:
问一下,可以在 tomcat 建立tcp 长连接吗?
tomcat中的长连接
在开始这个话题之前,我们先聊一下线程。线程的目的就是为了让一些程序片段能够“同时”进行,至少是视觉上。因为实际上,这些程序片段是“交替”执行的。如图1
在途中,线程A和线程B轮流交替地占有CPU的处理时间。也许有人说,CPU总的计算量并没有降低啊,确实如此,还可以切换线程,还增加了一点点的计算量。如果现在有一个很长很复杂很费时的计算任务,和一个精彩电影的播放任务,那我们当然愿意选择让这两个不太相干的任务同时并发执行。由此可见线程的目的是用一些调度算法,使电脑用户不会“等待”的不耐烦。因为绝大多数的用户都希望计算机体贴周到,富有人性化,提供更好的服务。事实上,我们在计算机上做的很多革新,就是为了如此。
Java是支持线程的,不像C++,还需要操作系统的配合才行,当然java最终还是要用到操作系统底层的支持,才可以拥有多线程编程的能力,呵呵。Java实现线程非常简单。一个是继承Thread,一个是实现Runnable接口。我突然想起我毕业时面试时经常被问这样的问题,那时只不过是机械式的回答,里面有许多的道理倒没有现在认识深刻。我们需要并发的代码写在run方法里面就OK了,呵呵。至于java底层是如何压栈入栈,保护程序执行现场的,如何恢复现场的,我们就不必深究了,因为我们不是API级的程序员,我们需要的是学习别人的成果,迅速copy,快速开发,不然怎么超英赶美啊?我们的目的是为了图2中的“顺序执行”变成图1中的“并发执行”。其中图1中的“时间片”的划分是随机的。
Java的线程执行,也是非常简单的,new 一个线程,然后start就OK了。
关于Thread这个类,有时候容易混淆。打个比方说,使用这个类可以类比成英语里面的语法“Somebody do Something”。举个例子:
SomeBody类:
package wjj2; public class SomeBody { private String name; public SomeBody(String name) { this.name=name; } public void someBodyDo() { System.out.println(this.name+"早上7:45起床"); //随机生成停顿时间,为了模拟较长的代码执行时间,以下都是类似 try { int a=(int) ((long)1000* Math.random()); System.out.println(a); Thread.sleep(a); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.name+"7:50大便"); try { int a=(int) ((long)1000* Math.random()); System.out.println(a); Thread.sleep(a); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.name+"8:00刷牙,顺带刷刷舌苔"); try { int a=(int) ((long)1000* Math.random()); System.out.println(a); Thread.sleep(a); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.name+"8:05洗脸"); try { int a=(int) ((long)1000* Math.random()); System.out.println(a); Thread.sleep(a); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.name+"8:10搽雪花膏"); try { int a=(int) ((long)1000* Math.random()); System.out.println(a); Thread.sleep(a); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.name+"8:20到车站"); try { int a=(int) ((long)1000* Math.random()); System.out.println(a); Thread.sleep(a); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.name+"8:30搭上车"); try { int a=(int) ((long)1000* Math.random()); System.out.println(a); Thread.sleep(a); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.name+"8:40到公司吃饭"); try { int a=(int) ((long)1000* Math.random()); System.out.println(a); Thread.sleep(a); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.name+"8:50打开电脑发呆"); try { int a=(int) ((long)1000* Math.random()); System.out.println(a); Thread.sleep(a); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(this.name+"9:00开始工作"); } }
具有“打乱”代码执行顺序能力的Thead子类:SomeBodyWork类:
package wjj2; public class SomeBodyWork extends Thread{ private SomeBody person; public SomeBodyWork (SomeBody person) { this.person=person; } public void run() { person.someBodyDo(); } }
程序入口类:main类:
package wjj2; public class main { public static void main(String args[]) { SomeBody xiaoming=new SomeBody("小明 "); SomeBodyWork thread1=new SomeBodyWork(xiaoming); thread1.start(); SomeBody dagang=new SomeBody("大刚 "); SomeBodyWork thread2=new SomeBodyWork(dagang); thread2.start(); } }
程序执行结果如下:
小明 早上7:45起床 571 大刚 早上7:45起床 908 小明 7:50大便 395 大刚 7:50大便 583 小明 8:00刷牙,顺带刷刷舌苔 509 小明 8:05洗脸 25 大刚 8:00刷牙,顺带刷刷舌苔 224 小明 8:10搽雪花膏 962 大刚 8:05洗脸 292 大刚 8:10搽雪花膏 665 小明 8:20到车站 554 大刚 8:20到车站 278 大刚 8:30搭上车 934 小明 8:30搭上车 577 小明 8:40到公司吃饭 238 小明 8:50打开电脑发呆 812 大刚 8:40到公司吃饭 453 大刚 8:50打开电脑发呆 361 小明 9:00开始工作 大刚 9:00开始工作
通常Somebody自成一个单独的类,线程的目的就是:让 Somebody 并发地 doSomething。
从程序的结果来看:
1.两个线程的代码确实像图1一样,交替执行,且交替顺序是随机的,多试几次会发现执行结果会有不同。
2.线程的run()方法提供了一种机制,一种把代码执行顺序“打乱”的机制,有些初学者喜欢在这个提供这个机制的类中,写一下“实体”类的方法,比如,他会让SomeBody类在SomeBodyWork中做一些事情,如
System.out.println(this.name+"早上10:00开始编码"); System.out.println(this.name+"早上11:00开始测试"); System.out.println(this.name+"下午14:45开始修改代码");
虽然Java中,什么东西都是对象,什么东西都以对象的模板“类”来展现,但类和类之间,还是有区别的,
很显然,以上3行代码,还是属于“实体”这些类的方法,应该移植在“实体”类中,Thread这个类,提供了一种机制,这种机制用“类”来展现,很神奇吧,呵呵。所以最好不要把杂七杂八的东东放在Thread的子类中,就是一个run()最好,Thread就是纯粹用来“并发”地run的。关于代码的归类,可以参考《重构--改善既有代码的设计》,Martin Fowler著,侯捷,熊节译,中国电力出版社。
发表评论
-
java NIO
2013-05-02 16:51 791... -
Thread.interrupt
2013-04-10 21:25 1015Thread.interrupt(),就是置状态。 ... -
分布式事务2
2013-02-19 14:16 10231.jar包,应该用带有二步提交事务的驱动,mysq ... -
分布式事务
2013-02-17 17:40 2405... -
spring SimpleFormController流程
2013-02-08 11:43 1782最近在学习spring mvc. 网上了收集了一下Simp ... -
ASM 使用的一个范例。
2012-10-19 14:05 4591现在开始研究Junit,试图通过Junit来改善自己的编 ... -
谷歌面试题一枚
2012-10-16 09:46 1293机械开发代码久了,看了看一些面试题,可以活跃大脑,最近网上看了 ... -
java concurrent学习记录
2012-10-10 09:51 937今天决定学习一下java.concurrent包,以这个 ... -
jsonlib json-->object,忽略object中没有的属性
2012-09-21 09:42 10010Java code skel ... -
java并发编程pdf纠错
2012-08-14 09:21 0java并发编程实践里面讲究CAS算法,其中这个 算法comp ... -
5分钟内搞定 Tomcat 的 SSL 配置
2012-07-02 11:52 9035分钟内搞定 Tomcat 的 SSL 配置(转) ... -
java nio测试
2012-06-29 12:00 995import java.io.IOException; ... -
屌丝comet
2012-06-26 09:29 872很显然tomcat能和浏览器之间实现长连接还是不错的,看了ib ... -
eclipse 远程调试 web程序
2012-05-31 16:37 992需要远程调试web程序,没办法啊。 1. 需要把%TO ... -
tomcat停止
2012-04-18 12:50 0#!/bin/sh #kill tomcat pid ... -
json转java对象
2012-04-10 20:54 1057String json = "{\&qu ... -
bonecp源码陌生类选读
2012-03-01 17:16 837今天在学习bonecp源码,看到了好多从来没有用过的类,现在记 ... -
TOMCAT源码分析(消息处理)(转)
2012-02-28 14:06 788TOMCAT源码分析(消息处理) http://bl ... -
tomcat流程启动图
2012-02-28 10:56 971tomcat6从启动到监听8080端口来处理请求的过程,如图: ... -
tomcat源码的几个问题
2012-02-24 11:31 9631. tomcat如何区分静态页面.html .jpg 和.j ...
相关推荐
在“Java多线程学习总结6”这个主题中,我们可以深入探讨Java多线程的实现、管理及优化。下面将详细阐述相关知识点。 1. **线程的创建方式** - **继承Thread类**:自定义类继承Thread类,并重写run()方法,创建...
Java多线程学习总结.pdf
### Java多线程学习总结 #### 一、Java多线程基本概念 1. **线程状态** - Java中的线程状态分为以下几种:新生(New)、可运行(Runnable)、运行(Running)、等待/阻塞(Waiting/Blocked)以及终止(Terminated...
下面是对Java多线程学习的详细解析。 1. **多线程概述**: 多线程是指一个程序内可以同时执行多个独立的执行流,每个执行流被称为一个线程。Java通过Thread类来代表线程,每个线程都有自己的生命周期,包括新建、...
Java多线程是Java编程中的一个核心概念,它在现代软件开发中扮演着至关重要的角色。...通过深入学习和实践上述Java多线程的知识点,开发者能够构建出高效、稳定、可控的多线程程序,满足各种复杂的并发需求。
### Java中的多线程学习总结 #### 一、线程与进程的概念 在计算机科学中,**进程**和**线程**是两个重要的概念。早期的Windows 3.x系统中,进程是最小的运行单位。到了Windows 95/NT等操作系统中,除了进程外还...
### Java多线程学习资料知识点解析 #### 一、引言 Java作为一种广泛使用的编程语言,在并发编程领域具有独特的优势。多线程是Java中实现并发处理的核心技术之一,能够显著提升程序的性能和响应性。本文将深入探讨...
### Java多线程编程总结 #### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** 当前的操作系统通常都是多任务操作系统,多线程是一种实现多任务的方式之一。在操作系统层面,进程指的是内存中运行的...
总结来说,Java多线程学习和FTP上传结合,可以帮助我们构建高效、可控的文件上传服务。通过线程池,我们可以更好地管理并发任务,优化资源使用,提高FTP上传的性能。学习这些内容对于Java开发者尤其重要,尤其是在...
本文档("Java线程学习和总结.htm")可能包含了更多关于线程的实例、源码分析和常见问题解决方案,你可以通过阅读来进一步加深对Java线程的理解。同时,"Java线程学习和总结.files"目录下的文件可能是与文章相关的...
总结起来,“JAVA多线程编程技术PDF”涵盖了多线程的基本概念、同步机制、线程通信、死锁避免、线程池以及线程安全的集合类等内容。通过深入学习这份资料,开发者可以全面掌握Java多线程编程技术,提升程序的并发...
【Java 多线程学习详细总结】 在Java编程中,多线程是处理并发执行任务的关键技术。本文将深入探讨Java中的多线程概念、实现方式、线程状态转换、线程调度、线程同步以及数据传递等相关知识。 1. **扩展`java.lang...