- 浏览: 650095 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (144)
- grails (2)
- jboss (2)
- html5 (2)
- maven (9)
- mysql (9)
- android (13)
- java (39)
- javascript (16)
- flex (3)
- oracle (7)
- ubuntu (5)
- tomcat (1)
- ssh (1)
- iphone (0)
- eclipse (5)
- jquery (4)
- web (7)
- ibatis (7)
- dwr (5)
- hibernate (1)
- ws (0)
- freemarker (4)
- css (2)
- webservice (1)
- html (2)
- jsp (4)
- os (5)
- xp (4)
- cpu (2)
- sql (5)
- db (2)
- 数据库 (5)
- log4j.properties (1)
- date (1)
- map (1)
- log4j (1)
- java spring dwr (1)
- (2)
- xml (4)
- ajax (3)
- servlet (1)
- xmlhttp (1)
- linux (2)
- socket (2)
- java,多线程 (1)
- android,java,os (1)
- Android,java (2)
- spring (1)
- java,dwr (1)
- js (2)
- 回调 (1)
- java,event (1)
- java ,注解, (1)
- avd (1)
- sdk (1)
- maven,java,xml,nexus (1)
- java,maven,nexus (1)
- Maven,Android,i-jetty,java (1)
- web js 参数 (1)
- java mac os (1)
- mac os (2)
- mac (1)
- 环境 (1)
- 搭建 (1)
- adt (1)
- adb (1)
- iOS (1)
最新评论
-
lhs472194266:
可以 X-Forwarded-For 可以轻易的被伪造
Java获取IP地址:request.getRemoteAddr()警惕 -
Nabulio:
图片全部加载不出来
maven 建立本地仓库 -
wahaha603:
...
Properties的相对路径以及文件的读取操作 -
一别梦心:
图片没了,楼主补充一下吧
maven 建立本地仓库 -
a_jie1981:
a_jie1981 写道试试http://www.findma ...
maven 建立本地仓库
import java.util.concurrent.*; /** * Java线程:有返回值的线程 * * @author Administrator */ public class Test { public static void main(String[] args) throws ExecutionException, InterruptedException { //创建一个线程池 ExecutorService pool = Executors.newFixedThreadPool(2); //创建两个有返回值的任务 Callable c1 = new MyCallable("A"); Callable c2 = new MyCallable("B"); //执行任务并获取Future对象 Future f1 = pool.submit(c1); Future f2 = pool.submit(c2); //从Future对象上获取任务的返回值,并输出到控制台 System.out.println(">>>"+f1.get().toString()); System.out.println(">>>"+f2.get().toString()); //关闭线程池 pool.shutdown(); } } class MyCallable implements Callable{ private String oid; MyCallable(String oid) { this.oid = oid; } @Override public Object call() throws Exception { return oid+"任务返回的内容"; } }
>>>B任务返回的内容
Process finished with exit code 0
一、通过类变量和方法返回数据
使用这种方法返回数据需要在调用start方法后才能通过类变量或方法得到数据。让我们先来看看会得到什么结果。
package mythread; public class MyThread extends Thread { private String value1; private String value2; public void run() { value1 = "通过成员变量返回数据"; value2 = "通过成员方法返回数据"; } public static void main(String[] args) throws Exception { MyThread thread = new MyThread(); thread.start(); System.out.println("value1:" + thread.value1); System.out.println("value2:" + thread.value2); } }运行上面的代码有可能输出如下的结果:
value1:null
value2:null
从上 面的运行结果看很不正常。在run方法中已经对value1和value2赋了值,而返回的却是null。发生这种情况的原因是调用start方法后就立 刻输出了value1和value2的值,而这里run方法还没有执行到为value1和value2赋值的语句。要避免这种情况的发生,就需要等run 方法执行完后才执行输出value1和value2的代码。因此,我们可以想到使用sleep方法将主线程进行延迟,如可以在 thread.start()后加一行如下的语句:sleep(1000);
这样做可以使主线程延迟1秒后再往下执行,但这样做有一个问题,就是我们怎么知道要延迟多长时间。在这 个例子的run方法中只有两条赋值语句,而且只创建了一个线程,因此,延迟1秒已经足够,但如果run方法中的语句很复杂,这个时间就很难预测,因此,这 种方法并不稳定。
我们的目的就是得到value1和value2的值,因此,只要判断value1和value2是否为null。如果它们都不为null时,就可以输出这两个值了。我们可以使用如下的代码来达到这个目的:
while (thread.value1 == null || thread.value2 == null);
使用上面的语句可以很稳定地避免这种情况发生,但这种方法太耗费系统资源。大家可以设想,如果run方法中的代码很复杂,value1和value2需 要很长时间才能被赋值,这样while循环就必须一直执行下去,直到value1和value2都不为空为止。因此,我们可以对上面的语句做如下的改进:
while (thread.value1 == null || thread.value2 == null)
sleep(100);
在while循环中第判断一次value1和value2的值后休眠100毫秒,然后再判断这两个值。这样所占用的系统资源会小一些。
上面的方法虽然可以很好地解决,但Java的线程模型为我们提供了更好的解决方案,这就是join方法。在前面已经讨论过,join的功能就是使用线程 从异步执行变成同步执行。当线程变成同步执行后,就和从普通的方法中得到返回数据没有什么区别了。因此,可以使用如下的代码更有效地解决这个问题:
... thread.start(); thread.join(); ...
下面例子中通过Work类的process方法向线程中传递了计算结果,但同时,也通过process方法从线程中得到了三个随机数。因此,这种方法既可以向线程中传递数据,也可以从线程中获得数据。
package mythread; class Data { public int value = 0; } class Work { public void process(Data data, Integer numbers) { for (int n : numbers) { data.value += n; } } } public class MyThread3 extends Thread { private Work work; public MyThread3(Work work) { this.work = work; } public void run() { java.util.Random random = new java.util.Random(); Data data = new Data(); int n1 = random.nextInt(1000); int n2 = random.nextInt(2000); int n3 = random.nextInt(3000); work.process(data, n1, n2, n3); // 使用回调函数 System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+" + String.valueOf(n3) + "=" + data.value); } public static void main(String[] args) { Thread thread = new MyThread3(new Work()); thread.start(); } }在上面代码 中的 process方法被称为回调函数。从本质上说,回调函数就是事件函数。在 Windows API中常使用回调函数和调用 API的程序之间进行数据交互。因此,调用回调函数的过程就是最原始的引发事件的过程。在这个例子中调用了 process方法来获得数据也就相当于在 run方法中引发了一个事件。
发表评论
-
android wifi 无线调试
2012-06-17 17:24 4401数据线丢了,不想花钱去买,在网上看了看,android手机 ... -
adb server is out of date. killing...
2012-06-17 17:20 8025在cmd窗口输入adb shell 或 adb connect ... -
JAVA 回调
2012-06-12 11:35 917熟悉MS-Windows和X Windows ... -
Class is not accessible due to restriction on required library
2012-06-03 12:13 989How to solve This error messag ... -
Column 'id' in field list is ambiguous
2012-04-23 18:20 7645Column 'id' in field list is am ... -
java.util.ConcurrentModificationException
2012-04-01 16:24 0工作中碰到个ConcurrentModificationExc ... -
在Spring框架下获取Bean的方式总结
2012-04-01 16:23 0众所周知,Spring框架将D ... -
普通Java类获取Spring的Bean的方法
2012-04-01 16:18 1307在SSH集成的前提下。某 ... -
android 调用系统图片浏览器并返回图片路径
2012-04-01 15:56 2514调用系统图片浏览器的方法如下: Intent intent ... -
网络编程中Nagle算法和Delayed ACK的测试
2012-03-31 16:43 1408Nagle算法 的立意是良 ... -
ibatis的remapResults属性合理运用
2012-03-31 15:51 1473Proper Usage of remapResults=&q ... -
response.setHeader()下载中文文件名的设置
2012-03-31 15:44 103921. HTTP消息头 (1)通用信息头 即能用于请求消息中 ... -
判断当前操作系统是不是window
2012-03-19 09:08 1586/** * 判断当前操作系统是不是window * * ... -
freemarker数字格式化
2012-03-17 16:53 3040freemarker在解析数据格式的时候,自动默认将数字按3为 ... -
数据库时客户端提示 Cannot proceed because system tables used by Event Scheduler
2012-02-29 21:13 9866在打开数据库或者用数据库管理工具(Navicat)时客户端提示 ... -
Socket用法详解
2012-02-22 16:49 1124一、构造Socket Socket的构造方法有以下几种重 ... -
在任意位置获取应用程序Context
2012-02-16 10:53 1020Android程序中访问资源时需要提供Context,一般来说 ... -
JAVA进程CPU占用率分析方法
2012-02-13 17:05 35721: 首先把JDK Linux版本上传到服务器上.2: 使 ... -
MYSQL索引优化和in or替换为union all
2012-02-07 17:08 1258使用UNION ALL代替OR,这不是绝对的。具体什么时候选择 ... -
dwr同步问题
2012-02-06 22:58 861想要异步的时候,想要同步的时候同步,在不同的情况下我们有不同的 ...
相关推荐
总结来说,Java多线程批量数据导入是一种高效处理大数据的方法。正确地设计和实施多线程策略,结合合适的并发控制和错误处理机制,能够有效提升系统的并发处理能力和性能。通过不断实践和优化,我们可以构建出更加...
3. **分页查询**:分页是一种优化大数据量查询的技术,它将结果集分割成多个小块(页面),每次只返回用户请求的一部分数据。这样不仅可以减轻服务器压力,还能减少网络传输的负担,提高响应速度。 4. **C#线程**:...
可以使用`quit()`方法来停止事件循环,然后等待`wait()`方法返回,确保线程已退出。 在提供的`TestMoveToThread`文件中,可能包含了具体的示例代码,演示了如何创建和使用`moveToThread`方法。这个例子可能包括两个...
Delphi 提供了几种同步机制,如 TEvent, TMutex, TCriticalSection 等。在这里,我们使用 TEvent 来同步主线程和工作线程。工作线程完成任务后,通过 SetEvent 触发事件,主线程则通过 WaitFor 监听该事件,确保在...
因此,采用一种能够预先查询数据,并且能够快速响应后续请求的方法显得尤为重要。 #### 二、Java多线程分页查询原理及实现 ##### 1. 分页查询基础概念 分页查询是指在查询数据时,将数据分成多个页面展示,而不是...
下面将详细讨论几种常见的线程间通信方式。 1. 使用全局变量进行通信 全局变量是所有线程都能访问的内存区域,因此可以用来传递简单的数据。为了确保多线程环境下的正确性,通常会使用`volatile`关键字修饰全局变量...
在调用 Thread 类的 Start 方法之前,会一直保持在 Unstarted 状态,调用方法之后,就会进入 Started 状态, 并立即将程序的控制权返回调用程序(点了线程调用后,可以立即去干别的事)。 四、线程优先级 每个线程...
本文将详细介绍几种常见的跨线程调用控件的方法,并解释其背后的原理。 #### InvokeRequired 属性 在Windows窗体控件中,有一个重要的属性 `InvokeRequired`,用于检查当前线程是否是创建该控件的线程。当该属性...
易语言是一种中文编程环境,它提供了方便的线程操作接口。本篇将详细探讨如何在易语言中实现“正确退出线程”这一重要知识点。 首先,理解线程的基本概念是至关重要的。线程是程序中的执行路径,一个进程可以包含多...
线程在其生命周期中会经历以下几种状态:新建、就绪、运行、阻塞和死亡。 1. **新建**:创建了一个新的线程对象。 2. **就绪**:调用`start()`方法后,线程处于可运行状态,等待CPU时间片。 3. **运行**:线程获得...
线程池是一种线程使用模式,它预先创建了一组可重用的线程,而不是每当需要时就创建新线程。这种设计可以避免频繁创建和销毁线程带来的性能开销,同时能够更好地管理和控制系统的资源。Facebook的线程池可能包含了...
3. `pthread_exit()`: 结束当前线程并返回一个状态码。 4. `pthread_self()`: 获取当前线程ID。 5. `pthread_equal()`: 比较两个线程ID是否相等。 6. 同步机制:`pthread_mutex_t`互斥量,用于保护临界区;`pthread_...
线程池是一种线程使用模式,它预先创建一组线程,当需要执行任务时,从线程池中取出空闲线程执行任务,完成后线程返回线程池,而不是直接销毁。线程池可以有效地减少线程创建和销毁的开销,提高系统效率。在易语言...
线程池预先创建一定数量的线程,当有任务需要执行时,从池中获取空闲线程,任务完成后线程返回到池中等待下一次使用。 6. **线程通信**:线程间通信是多线程编程中的另一个重要方面,主要目的是协调线程间的操作。...
Java中的`ExecutorService`和`ThreadPoolExecutor`就是线程池的实现,它们允许预先创建一定数量的线程,然后根据需要从池中获取和返回线程。 7. **并发与并行**:并发是指多个任务在一段时间内交替执行,而并行则...
在VC++编程环境中,多线程技术是一种常用的方法来实现程序的并发执行,提高系统效率。本主题将详细探讨如何使用VC++中的`::CreateThread`函数进行工作线程的封装,以及相关的重要知识点。 首先,`::CreateThread`是...