更新时间:2022-06-02 05:44:12
并行模式与算法是并发中常见的问题。例如一些常用的模式化处理,我们也会接触。但是在现在多核下,合理安排好并发保证数据安全一些基本的常识我们还是需要了解的。
/** * Created by ycy on 16/1/15. * 单例模式 */ public class SingletonDemo { private SingletonDemo() { System.out.println("singleton is create"); } private static class SinggletonHodel { private static SingletonDemo instance = new SingletonDemo(); } public static synchronized SingletonDemo getInstance() { return SinggletonHodel.instance; } public static void main(String[] args) { System.out.println(SingletonDemo.getInstance()); } }
public final class Product{ private final String no; private final String name; private final double price; public Product(String no,String name,double price){ super(); this.no=no; this.name=name; this.price=price; } public String getNo() { return no; } public String getName() { return name; } public double getPrice() { return price; } }
package pattern; import javax.print.attribute.standard.RequestingUserName; /** * Created by ycy on 16/1/15. */ public final class PCData { private final int intDate;//数据 public PCData(int d){ intDate=d; } public PCData(String d){ intDate=Integer.valueOf(d); } public int getIntDate() { return intDate; } @Override public String toString(){ return "date:"+intDate; } }
package pattern; import java.util.Random; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** * Created by ycy on 16/1/15. */ public class Producer implements Runnable{ <h3> </h3> private volatile boolean isRunning=true; private BlockingQueue<PCData> queue;//内存缓冲区 private static AtomicInteger count=new AtomicInteger();//总数.原子操作 private static final int SLEEPTIME=1000; public Producer(BlockingQueue<PCData> queue){ this.queue=queue; } public void run() { PCData data=null; Random r=new Random(); System.out.println("start produer id=" +Thread.currentThread().getId()); try{ while (true){ Thread.sleep(r.nextInt(SLEEPTIME)); data=new PCData(count.incrementAndGet());//构造任务数据 System.out.println(data+" is put into queue"); if (!queue.offer(data,2, TimeUnit.SECONDS)){ System.out.println("failed to put data:"+data);//提交数据到缓冲区 } } }catch (InterruptedException e){ e.printStackTrace(); Thread.currentThread().interrupt(); } } public void stop(){ isRunning=false; } }
package pattern; import java.text.MessageFormat; import java.util.Random; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.locks.Condition; /** * Created by ycy on 16/1/15. */ public class Consumer implements Runnable{ private BlockingQueue<PCData> queue;//缓冲 去 private static final int SLEEPTIME=1000; public Consumer(BlockingQueue<PCData> queue){ this.queue=queue; } public void run() { System.out.println("start Consume id ="+Thread.currentThread().getId()); Random r=new Random();//随机等待时间 try{ while (true){ PCData data=queue.take();//提前任务 if (null!=data){ int re=data.getIntDate()*data.getIntDate();//计算平方 System.out.println(MessageFormat.format("{0}*{1}={2}",data.getIntDate(),data.getIntDate(),re)); } } }catch (InterruptedException e){ e.printStackTrace();; Thread.currentThread().interrupt(); } } public static void main(String[] args) throws InterruptedException { //建立缓冲区 BlockingQueue<PCData> queue = new LinkedBlockingDeque<PCData>(10); Producer p1 = new Producer(queue); Producer p2 = new Producer(queue); Producer p3 = new Producer(queue); Consumer consumer1 = new Consumer(queue); Consumer consumer2 = new Consumer(queue); Consumer consumer3 = new Consumer(queue); ExecutorService service = Executors.newCachedThreadPool();//建立线程池 service.execute(p1); service.execute(p2); service.execute(p3); service.execute(consumer1); service.execute(consumer2); service.execute(consumer3); Thread.sleep(10*1000); p1.stop(); p2.stop(); p3.stop(); Thread.sleep(3000); service.shutdown(); } }