多线程顺序执行

3 条评论

前两个月做的一道JAVA题:有一个字符数组,现要求创建4个线程,每个线程分别负责向数组里写入一种字符("A"到“D”),要求数组内的字符按照“A”到“D”的顺序排列,并且输入的次数可以通过参数控制。比如4个线程写3次,字符数组内的字符最终就是 “ABCDABCDABCD”。

题目的要求非常简单,也不涉及算法,简单分析一下,就是如何控制多线程的执行顺序。再针对具体问题,其实就是多个线程争夺一个共享的字符数组资源,该共享资源拥有多种不同的状态,线程获得资源后只有符合某种条件时,才允许进行操作。这几个特征,直接指向了JAVA内锁变量的使用场景。

我的实现如下:

1.工作线程对象,初始化时指定向共享数组写入的字符。工作时调用共享资源的写方法。

2.SharedCharArray 对象,他就是被多线程竞争的共享资源,内部包含一个字符数组,以及表示当前应该写入位置的游标,同时他包含了每个写入字符和对应锁变量的映射关系。资源的写方法执行时,首先进入可重入锁,然后取准备输入字符对应的条件锁,检查是否符合写条件,如果不符合就进入 wait 状态。如果符合,就写入当前准备输入的字符到共享输入,然后游标+1,给下一个应该输入字符的锁变量发送信号。最终,释放锁。

多线程的执行流程不好表述,可以直接查看实现的代码,见 github 上,不再贴一遍了。

相关日志 Relate Posts

收藏与分享 : Twitter | Facebook | 微博 | 人人 | Google+ | PDF

“多线程顺序执行”3条留言

  1. 线程,能回避则回避- -

  2. 实现一个不用锁的,和楼主说的“多线程顺序执行”无关 😉

    public class WriteArrThread implements Runnable {
    private char[] arr;
    private char ch;
    private int pos;
    private int step;

    public WriteArrThread(char[] arr, char ch, int pos, int step) {
    this.arr = arr;
    this.ch = ch;
    this.pos = pos;
    this.step=step;
    }

    @Override
    public void run() {
    for(int k=0;k<arr.length;k++){
    if((k==pos) || (k % step==pos)){
    arr[k]=(ch);
    }
    }
    }

    public static void main(String args[]) throws Exception{
    int threads=5;
    int loop=6;
    char beginchar='A';
    Thread[] writeTheads = new Thread[threads];
    char[] arr = new char[loop*threads];
    for(int z=0;z<threads;z++){
    Thread t = new Thread(new WriteArrThread(arr,(char)(beginchar + z),z,threads));
    writeTheads[z]=t;
    t.start();
    }
    for(int z=0;z<threads;z++){
    writeTheads[z].join();
    }
    System.out.println(new String(arr));
    }
    }

发表留言(Ctrl+Enter提交)