1.创建四个线程,打印16个日志对象,使用队列的方式。
public class Test {
public static void main(String[] args) {
BlockingQueue<String> queue=new ArrayBlockingQueue<String>(16);
for(int i=0;i<4;i++){
new Thread(new Runnable(){
@Override
public void run() {
while(true){
String logs;
try {
logs = queue.take();
Test.parseLog(logs);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
System.out.println("begin:"+(System.currentTimeMillis()/1000));
for(int i=0;i<16;i++){
final String logs=""+(i+1);
//Test.parseLog(logs);
try {
queue.put(logs);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void parseLog(String log){
System.out.println(log+":"+(System.currentTimeMillis()/1000));
}
}
2.一个生产者生产十个对象,创建十个消费者线程,每间隔一秒取一个对象,取对象的要按照生产的顺序。
package com.zyyw.service.dispatch;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Semaphore;
import java.util.concurrent.SynchronousQueue;
public class Test {
public static void main(String[] args) {
Semaphore order=new Semaphore(1);
final SynchronousQueue<String> queue=new SynchronousQueue<String>();
for(int i=0;i<10;i++){
new Thread(new Runnable(){
@Override
public void run() {
try {
order.acquire();
String input=queue.take();
String output=TestDo.doSome(input);
System.out.println(Thread.currentThread().getName()+":"+output);
order.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
System.out.println("begin:"+(System.currentTimeMillis()/1000));
for(int i=0;i<10;i++){
String input=i+"";
try {
queue.put(input);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class TestDo{
public static String doSome(String input){
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
String output=input+":"+(System.currentTimeMillis()/1000);
return output;
}
}