Eclipse客户端程序中多线程的使用[1]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Eclipse客户端程序中多线程的使用[1]相关的知识,希望对你有一定的参考价值。

参考技术A

  本文分析了Eclipse中多线程程序的实现 讨论了在Eclipse客户端程序开发中应用多线程的方法和要注意的问题 同时也讨论了多线程程序的一些调试和问题解决的方法

  Eclipse作为一个开发平台 使用越来越广泛 基于Eclipse Rich Client Platform开发的客户端程序也越来越多 在当今越来越复杂的应用环境中 我们的客户端程序不可避免的要同时进行多任务的处理 一个优异的客户端程序都会允许用户同时启动多个任务 从而大大提高用户的工作效率以及用户体验 本文中我们来谈谈Eclipse中实现多任务的方式

  在我们基于Eclipse的Java程序中 我们有很多种方式提供多任务的实现 熟悉Java的朋友立即会想到Java的Thread类 这是Java中使用最多的一个实现多任务的类 Eclipse平台为多任务处理提供了自己的API 那就是Job以及UIJob Eclipse中的Job是对Java Thread的一个封装 为我们实现多任务提供了更方便的接口 以下是Job的基本用法

  清单 Job用法示例

                Job job = new Job( Job Name )protected IStatus run(IProgressMonitor monitor)       // 在这里添加你的任务代码  return Status OK_STATUS; ;job schedule(delayTime);

  在Eclipse中我们也会经常用到Display asynchExec() 和Display synchExec()来启动任务的执行 这两个方法主要为了方便我们完成界面操作的任务 以下是Display asynchExec()的用法 Display synchExec()和它类似

  清单 Display synchExec()用法示例

Display getDefault() asyncExec(new Runnable() public void run()  // 在这里添加你的任务代码   );

  通常 在Eclipse中我们最好使用Eclipse提供的Job接口来实现多任务 而不是使用Java的thread 为什么呢?主要有以下几个原因

  Job是可重用的工作单元 一个Job我们可以很方便的让它多次执行 Job提供了方便的接口 使得我们在处理中能够很方便的与外界交流 报告当前的执行进度 Eclipse提供了相应的机制使得程序员可以方便的介入Job的调度 例如我们可以方便的实现每次只有一个同一类型的Job在运行 Eclipse缺省提供了Job管理的程序 可以查看当前所有的Job和它们的进度 也提供UI终止 暂停 继续指定的Job 使用Job可以提高程序的性能 节省线程创建和销毁的开销 Eclipse中的Job封装了线程池的实现 当我们启动一个Job时 Eclipse不会马上新建一个Thread 它会在它的线程池中寻找是否有空闲的线程 如果有空闲线程 就会直接用空闲线程运行你的Job 一个Job终止时 它所对应的线程也不会立即终止 它会被返回到线程池中以备重复利用 这样 我们可以节省创建和销毁线程的开销 下面我们从几个方面来讨论Eclipse中Job的实现和使用方面的问题

   Eclipse中Job的实现

  Eclipse的核心包中提供了一个JobManager类 它实现了IJobManager接口 Eclipse中Job的管理和调度都是由JobManager来实现的 JobManager维护有一个线程池 用来运行Job 当我们调用Job的schedule方法后 这个Job会被JobManager首先放到一个Job运行的等待队列中去 之后 JobManager会通知线程池有新的Job加入了运行等待队列 线程池会找出一个空闲的线程来运行Job 如果没有空闲线程 线程池会创建一个新的线程来运行Job 一旦Job运行完毕 运行Job的线程会返回到线程池中以备下次使用 从上面Job运行的过程我们可以看到 JobManager介入了一个Job运行的全过程 它了解Job什么时候开始 什么时候结束 每一时候Job的运行状态 JobManager将这些Job运行的信息以接口的方式提供给用户 同时它也提供了接口让我们可以介入Job的调度等 从而我们拥有了更加强大的控制Job的能力

  为了我们更方便的了解Job所处的状态 JobManager设置Job的一个状态标志位 我们可以通过Job的getState方法获得Job当前的状态值以了解其状态

  NONE 当一个Job刚构造的时候 Job就会处于这种状态 当一个Job执行完毕(包括被取消)后 Job的状态也会变回这种状态 WAITING:当我们调用了Job的shedule方法 JobManager会将Job放入等待运行的Job队列 这时Job的状态为WAITING RUNNING:当一个Job开始执行 Job的状态会变为RUNNING SLEEPING:当我们调用Job的sleep方法后 Job会变成这一状态 当我们调用schudule方法的时候带上延时的参数 Job的状态也会转入这一状态 在这一段延时等待的时间中 Job都处于这一状态 这是一种睡眠状态 Job在这种状态中时不能马上转入运行 我们可以调用Job的wakeup方法来将Job唤醒 这样 Job又会转入WAITING状态等待运行

lishixinzhi/Article/program/Java/gj/201311/27703

Java中多线程,synchronized,与 AtomicInteger的问题

多个线程对AtomicInteger 生成的值进行 类似++ 或 --的操作
是不是就不需要 synchronized 来保证数据的准确了。
我在参考一个其他人的Java程序
他使用了AtomicInteger
但是在对于AtomicInteger值操作的 getNextId()方法中, 依然是用来sync...来修饰。
这样合理吗?是不是属于资源的浪费

通过AtomicInteger来操作 是线程安全的 ,而且性能貌似远超 用synchronized的方法
因此不用加synchronized。确实是资源的浪费。
参考技术A 首先 :AtomicXXX,是J.C.U并发包下的类,用该类来代替普通的类,可以保证++/--操作是原子性的,也就是Atomic声明的类型,进行100次++,结果一定是增加100。普通int类型加100次,结果是<=100,这个就牵涉从CPU缓存取变量的数据过程中,N个java线程薝缓存之间变量没有可见性的原因。至于何谓‘可见性’,请参考《JAVA并发编程实践》或者《深入JAVA虚拟机》。
然后:你提到getNextId()上面加上sync,因为getNextId在JAVA层面来讲,是一个‘复合操作’(具体你可以看一下该方法的源码就明白了),在这个操作中会浪费一定的时间,你可以测试一下
method ()

syn(atomicNum)
Thread.sleep(1000);
return atomicNum.getNextId();




如果不用sync来获取atomicNum的锁定,很可能会出现线程不同步的问题。本回答被提问者采纳
参考技术B 当然需要同步,比如说,现在有一个初值为8的id,a和b两个都调用getNextId()方法,拿id的时候初值都为8,然后a和b都把自己的id++,就都是9,这样就会出错了,而id值也会出现错乱,追问

但是原子值AtomicInteger的存在意义不就是在不使用Sync下也可以多线程安全++ 或--吗

参考技术C 用volatile修饰属性即可。 参考技术D jutidian

以上是关于Eclipse客户端程序中多线程的使用[1]的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统中多线程实现方法的全面解析

java多线程死循环

JAVA Eclipse中的Android程序如何使用线程

用java多线程实现服务器与客户端之间的文件传输的代码!!!急!!!!

Java中多线程的使用!!

iOS设计中多线程的简单介绍