java多线程共同操作同一个队列,怎么实现?

Python012

java多线程共同操作同一个队列,怎么实现?,第1张

具体代码如下:

以下是两个线程:

import java.util.*

public class Thread_List_Operation {

//假设有这么一个队列

static List list = new LinkedList()

public static void main(String[] args) {

Thread t

t = new Thread(new T1())

t.start()

t = new Thread(new T2())

t.start()

}

}

//线程T1,用来给list添加新元素

class T1 implements Runnable{

void getElemt(Object o){

Thread_List_Operation.list.add(o)

System.out.println(Thread.currentThread().getName() + "为队列添加了一个元素")

}

@Override

public void run() {

for (int i = 0i <10i++) {

getElemt(new Integer(1))

}

}

}

//线程T2,用来给list添加新元素

class T2 implements Runnable{

void getElemt(Object o){

Thread_List_Operation.list.add(o)

System.out.println(Thread.currentThread().getName() + "为队列添加了一个元素")

}

@Override

public void run() {

for (int i = 0i <10i++) {

getElemt(new Integer(1))

}

}

}

//结果(乱序)

Thread-0为队列添加了一个元素

Thread-1为队列添加了一个元素

Thread-0为队列添加了一个元素

Thread-1为队列添加了一个元素

Thread-1为队列添加了一个元素

Thread-1为队列添加了一个元素

Thread-1为队列添加了一个元素

Thread-1为队列添加了一个元素

Thread-1为队列添加了一个元素

Thread-1为队列添加了一个元素

Thread-1为队列添加了一个元素

Thread-1为队列添加了一个元素

Thread-0为队列添加了一个元素

Thread-0为队列添加了一个元素

Thread-0为队列添加了一个元素

Thread-0为队列添加了一个元素

Thread-0为队列添加了一个元素

Thread-0为队列添加了一个元素

Thread-0为队列添加了一个元素

Thread-0为队列添加了一个元素

java使用数据结构来实现FIFO先进先出的队列,实例如下:

/*

 * To change this template, choose Tools | Templates

 * and open the template in the editor.

 */

package linkedlisttest

import java.util.ArrayList

import java.util.Deque

import java.util.LinkedList

import java.util.List

/**

 *

 * @author Vicky.H

 * @email [email protected]

 */

public class FIFOTest {

    /**

     * @param args the command line arguments

     */

    public static void main(String[] args) {

        FIFO<A> fifo = new FIFOImpl<A>(5)

        for (int i = 0 i < 20 i++) {

            A a = new A("A:" + i)

            A head = fifo.addLastSafe(a)

            System.out.println(i + "\thead:" + head + "\tsize:" + fifo.size())

        }

        System.out.println("---------------")

        System.out.println("弹出数据")

        List<A> polls = fifo.setMaxSize(3)

        for (A a : polls) {

            System.out.println("\thead:" + a)

        }

        

        System.out.println("剩余数据")

        for (A a : fifo) {

            System.out.println("\thead:" + a)

        }

        System.out.println(fifo.size())

    }

}

interface FIFO<T> extends List<T>, Deque<T>, Cloneable, java.io.Serializable {

    /**

     * 向最后添加一个新的,如果长度超过允许的最大值,则弹出一个 *

     */

    T addLastSafe(T addLast)

    /**

     * 弹出head,如果Size = 0返回null。而不同于pop抛出异常

     * @return 

     */

    T pollSafe()

    /**

     * 获得最大保存

     *

     * @return

     */

    int getMaxSize()

    /**

     * 设置最大存储范围

     *

     * @return 返回的是,因为改变了队列大小,导致弹出的head

     */

    List<T> setMaxSize(int maxSize)

}

class FIFOImpl<T> extends LinkedList<T> implements FIFO<T> {

    private int maxSize = Integer.MAX_VALUE

    private final Object synObj = new Object()

    public FIFOImpl() {

        super()

    }

    public FIFOImpl(int maxSize) {

        super()

        this.maxSize = maxSize

    }

    @Override

    public T addLastSafe(T addLast) {

        synchronized (synObj) {

            T head = null

            while (size() >= maxSize) {

                head = poll()

            }

            addLast(addLast)

            return head

        }

    }

    @Override

    public T pollSafe() {

        synchronized (synObj) {

            return poll()

        }

    }

    @Override

    public List<T> setMaxSize(int maxSize) {

        List<T> list = null

        if (maxSize < this.maxSize) {

            list = new ArrayList<T>()

            synchronized (synObj) {

                while (size() > maxSize) {

                    list.add(poll())

                }

            }

        }

        this.maxSize = maxSize

        return list

    }

    @Override

    public int getMaxSize() {

        return this.maxSize

    }

}

class A {

    private String name

    public A() {

    }

    public A(String name) {

        this.name = name

    }

    public String getName() {

        return name

    }

    public void setName(String name) {

        this.name = name

    }

    @Override

    public String toString() {

        return "A{" + "name=" + name + '}'

    }

}