当前位置 : 主页 > 编程语言 > java >

第14章 多线程(16)Swing 的线程补充+线程示例与常见解法

来源:互联网 收集:自由互联 发布时间:2022-07-13
14.11.3 单一线程规则 基本原则:除了时间分配线程,不要再任何线程中接触Swing组件 特殊规则: 线程中可以添加、移除事件监听,然后触发时间分配线程 少量的Swing方法是安全的,如下


第14章 多线程(16)Swing 的线程补充+线程示例与常见解法_信号量

第14章 多线程(16)Swing 的线程补充+线程示例与常见解法_i++_02

 14.11.3 单一线程规则

基本原则:除了时间分配线程,不要再任何线程中接触Swing组件

特殊规则:

线程中可以添加、移除事件监听,然后触发时间分配线程

少量的Swing方法是安全的,如下:

JTextComponent.setText

JTextArea.insert

JTextArea.append

JTextArea.repalceRange

JComponent.repaint

JComponent.revalidate

记不住的话,还有个基本的,重绘方法是线程安全的,其他的当做不安全使用事件监听触发就可以了,不行就查查源码确定一下

第14章 多线程(16)Swing 的线程补充+线程示例与常见解法_sed_03

 补充1:示例:交替打印

题目来源:https://leetcode.cn/problems/print-foobar-alternately/

​​1115. 交替打印 FooBar​​

给你一个类:

class FooBar {
  public void foo() {
    for (int i = 0; i < n; i++) {
      print("foo");
    }
  }

public void bar() {
    for (int i = 0; i < n; i++) {
      print("bar");
    }
  }
}

两个不同的线程将会共用一个 FooBar 实例:

请设计修改程序,以确保 "foobar" 被输出 n 次。

 

示例 1:

输入:n = 1
输出:"foobar"
解释:这里有两个线程被异步启动。其中一个调用 foo() 方法, 另一个调用 bar() 方法,"foobar" 将被输出一次。

示例 2:

输入:n = 2
输出:"foobarfoobar"
解释:"foobar" 将被输出两次。

 

提示:

  • 1 <= n <= 1000
  • 线程 A 将会调用 foo() 方法,而
  • 线程 B 将会调用 bar() 方法

以下给出三种解法(都是自己写):

解法一:使用锁+Condition

网友评论