class Ticket1 { //初始化基本资源类数据 private char en = 65; private int no = 1; private String str = ""; private boolean flag = false; //线程加锁及唤醒机制 private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); //字母追加线程访问方法 public void enIncrement() throws InterruptedException { lock.lock(); try { while (flag) { condition.wait(); } str +=en; en ++; System.err.println(str); flag = true; condition.signalAll(); } catch (Exception e) { } finally { lock.unlock(); } } //数字追加线程访问方法 public void noIncrement() throws InterruptedException { lock.lock(); try { while (!flag) { condition.wait(); } str =str+ no+(no+1); no+=2; System.err.println(str); flag = false; condition.signalAll(); } catch (Exception e) { } finally { lock.unlock(); } } //预留的获取结果字符串方法(目前还没啥用) public String getStr() { return str; } }
设计资源类的基本要求就是资源内部封装好,仅对外提供访问方法,这样一来有效的降低了代码的耦合度,基本做到零耦合。其二 我编写的代码有一定的冗余,请各方大神引用时记得减去不必要的代码。
2.接下来就要做主程序(程序,函数,方法,随意叫着舒服就好)的编写。两个线程之间如何配合工作和如何唤醒的具体操作已经资源类Ticket1的方法中写了,所以主方法中只要new出两个线程,start两下就行了。
public class testMain2 { public static void main(String[] args) { Ticket1 ticket = new Ticket1(); //追加字母线程en new Thread(() -> { for (int i = 0; i < 26; i++) { try { Thread.sleep(300); ticket.enIncrement(); } catch (Exception e) { e.printStackTrace(); } } }, "en").start(); //追加数字线程no new Thread(() -> { for (int i = 0; i < 52; i++) { try { Thread.sleep(200); ticket.noIncrement(); } catch (Exception e) { e.printStackTrace(); } } }, "no").start(); } }
3.基本上代码就写完了,运行结果如下
截图不全后面还有具体多长根据线程循环次数而定。
PS:虽然可以达到预期的字符串拼接效果但是,中间有很多无用的字符串(因为每进行一次拼接就会打印一次结果,目前我只做到了这一点,至于如何只得到最终结果字符串的方法,我想各路大神必有不凡见解。勿吝指点。我只是按照自己的理解做的一个小demo,至于Java还有很多不是很熟悉的地方,如果有哪位大神看到这个样本,请指出其中用的不好的地方,多谢!!!)
java多线程打印出“A12B34C56D78E910...”的简单理解
最新推荐文章于 2021-09-06 18:56:20 发布