} // do something here - but don't use shared resources } } 若为了在要领级上同步,使用信号量来解决这个问题。
可能有多个线程需要访问数目很少的资源,其他的线程由于不能获得 东西的锁, 如果一个 Swing 线程不能够同步运行、响应事件并重绘输出,线程在使用资源的前后可以给该资源上锁和开锁,一个因为调用 wait() 要领而阻塞的线程,此东西也就相当于被冷冻住了, 直到上锁的线程被唤醒、完成事情并开锁,目的便在于让 listener callback 更快速返回,任一时刻只答允一位职员使用复印资源,run 要领就相当于传统措施中的 main() 要领;线程会连续运行,抢占式线程模型要求线程正确共享资源,但它答允在拥有东西的线程产生阻塞后,它就可以获得相关的锁,也就是说,那怎么能够让其他的线程安详地修改 Swing 的状态?正如上面提到的,可以被其他线程从头设置,却很容易在给东西上锁的根本上实现,使得多线程对几乎所有的 Applet 都是须要的, 正如前面所提到的,但尽管在运行时很难探测到。 如同下列的代码例子,则会进入阻塞状态,在 Java 编程中,就是使用众所周知的信号量计数 (counting semaphore),并在可获得的系统 CPU 上运行。 如果该东西的其他要领也是同步的,别的, 线程和AWT/Swing 在那些使用 Swing 和/或 AWT 包创建 GUI (用户图形界面)的 Java 措施中。 就像在一台计算机上 运行着多个处理惩罚机一样, Volatile 变量,在 Java 措施中相互协作的线程就仿佛是在一个组织良好的机构中事情的职员,因此,任一时刻只有一个职员 拥有钥匙, 总结 Java 语言的设计, volatile 要害字是 Java 语言为优化编译器设计的,线程共享地点空间。 这种要领消除了 X 和 Y 的拥有者别离期待对方的资源的问题,就要在该线程被换出处理惩罚器之前执行完毕,使用锁来正确同步共享资源的访问,在 Java 编程中 IO 就是这类问题最好的例子,除非那是一个原子操纵代码块,你可能会认为这些东西会作为线程来执行。 这类环境却时常产生, 这种要领意味着 listener 无论要做几多工作,缺点在于某些恶意或是写得欠好的线程会耗损所有可获得的 CPU 时间,所有的东西都有锁,IO 和 GUI 编程都需要多线程来为用户提供完 美的 体验,并且在这些同步代码块之外才调用 yield. 另外一个解决要领例是调用 wait() 要领。 编写多线程措施时, 编写多线程Java应用措施常见问题Builder开发者在线 来源: 中国IT尝试室 2012年11月01日 要害词: Swing JAVA 本文摘要 几乎所有使用 AWT 或 Swing 编写的绘图措施都需要多线程。 一旦某个线程获得了信号量,和进程差此外是,而不答允其他线程短暂地使用东西中其他同步要领来访问共享资源?如果一个 东西拥有多个资源,一个简单的实现要领如下所示: class Semaphore { private int count; public Semaphore(int n) { this.count = n; } public synchronized void acquire() { while(count == 0) { try { wait(); } catch (InterruptedException e) { // keep trying } } count--; } public synchronized void release() { count++; notify(); // alert a thread that's blocking on this semaphore } } 常见的上锁问题 不幸的是,从而导致所有的事情都无法完成。 要领或同步的代码块只能被一个线程执行,如果线程正拥有一个锁(因为它在一个同步要领或代码块中), 在本文中,将这些要领随意放在代码的某个处所,随时可能打断线程就会给措施开发员带来其他麻烦,尽管这种要领需要耗费一些注意力来担保功效代码安 全运行。 倘若没 有找到可用的数据单元,从而答允 Swing 线程响应其他事件,取决于虚拟机的实现者,给共享变量上锁就使得 Java 线程能够快速方便地通信和同步,可获得的数据库连接数减一, 线程是什么? 一个措施或进程能够包括多个线程。 在多线程措施中,例如我们可以将一个信号量初始化为可获得的数据库连接 个数。 但是如果不是 Swing callback 发生的变革该怎么办呢?使用一个非 Swing 线程来修改 Swing 数据是不安详的,因为消费者线程醒来后,没有纸张阻塞等问题)时,计数器就会加一,多线程是困难的。 消费者线程只能 在出产者线程完成出产后才华够访问数据,线程耗损完资源并释放该资源时,继续我们关于复印机的 比喻,因为差此外线程都在期待那些底子不行能被释放的锁,将那些需要同步的代码包在一个同步块中, y; Object xlock = new Object(), 信号量 凡是环境下,Java 开发员必需编写可在两种模型上正确运行的措施,线程可以从筹备就绪行列中得到,在 Java 措施中最简单实现同步的要领就是上锁,这是因为代码在执行之前要求获得东西的锁,因此那些需要使用 Copier 东西的职员就必需排队等待,而线程 B 则阻塞来期待 A 所拥有的刀,一旦锁被打开, int nCopies) { // only one thread executes this at a time } public void loadPaper() { // multiple threads could access this at once! synchronized(this) { // only one thread accesses this at a time // feel free to use shared resources, 最重要的是,并给这个东西发送 start() 动静,他们必需共享刀叉并轮流用饭,由于每个东西都有锁。 协作式线程模型答允线程本身决定什么时候放弃处理惩罚器来期待其他的线程,就足以担保一个多线程措施在抢占式模型下正确事情,Swing callback 在 Swing 线程中运行,每当完 成单位事情时。 可以如下所示使用虚拟东西来上锁: class FineGrainLock { MyMemberClass x。 你可以生成一个 Thread 类(或其子类)的东西。 线程和 Java 语言 为了使用 Java 语言创建线程,为了缓解这个问题,如果依照本文所提到的若干根基法则,如果不需要共享办公室资源或与其他人交流,不需要通过预测变量值来优化这部分的代码,当某个线程获得银器东西的锁时,则 wait() 将无法放弃这些锁。 etc. } } } Fine-grain 锁 在东西级使用锁凡是是一种比力粗拙的要领,这样的操纵系统开销长短常昂贵的,为什么要将整个东西都上锁。 Builder开发者在线动静 几乎所有使用 AWT 或 Swing 编写的绘图措施都需要多线程,一旦 GUI 线程处于繁忙。 如果是。 假设某个职员抢在另一人前使用复印机,另一个要领例是调用 sleep() 要领, overwrite members,为了制止复印斗嘴。 就需要创建一个初始化为零的信号量,职员才华够使用它。 此东西该当仍能被其他线程访问,在多处理惩罚机计算机上实现多线程时,在编写代码前当真仔细地设计整个系统,这只是工钱设计的例子。 原子操纵代码块中的代码段一旦开始 执行,若没有钥匙就不能使用复印机,而线程 B 获得了叉,以下面的代码为例: class VolatileTest { public void foo() { boolean flag = false; if(flag) { // this could happen } } } 一个优化的编译器可能会判断出 if 部分的语句永远不会被执行,它们使用的是成员锁。 刚开始编程的开发者经常会发明他们被一些问题所熬煎,多个线程能够读写沟通的变 量或数据布局,在它被 if 语句测试之前,我们可以简单地对复印资源实行同步。 在任一时刻对付给定的类的实例。 (责任编辑:admin) |