并发知识5

作者: 奔跑的蛙牛 | 来源:发表于2018-08-04 19:52 被阅读0次

死锁

锁和条件不能解决线程中的所有问题
账户1:200; 账户2:300;
线程1:从账户1转移300到账户2 线程2: 从账户2转移400到账户1
线程一和线程二都被阻塞了
两个账户的余额都不足以转账,两个线程无法执行下去
这样的状态称为死锁

线程局部变量

public static final SimpleDateFormate
dateFormdate = new SimpleDateForniat("yyyy-MM-dd");

String dateStamp = dateFormat.get() .format(new Date()) ; //调用

锁测试与超时

调用lock方法获取其他线程的锁可能会发生阻塞,应该更加安全的申请锁

    if(myLock.tryLock()){
        try{
        }finnally{
          myLock.unlock();
        }
    }else{
        // do something else
    }
  //  设置超时
  myLock.tryLock(100,TineUnit.MILLISECONDS)

弃用的方法

stop 方法不安全,强制停止线程
suspend 方法可能导致一个拥有锁的线程被挂起

阻塞队列

线程队列:使用队列以优雅且安全的方式将其形式化

  • 生产者线程向队列插入元素,消费者线程则取出它们
  • 使用队列可以安全的从一个线程向另一个线程传递数据
    我们使用阻塞队列来控制一组线程,程序在它的一个目录和所有子目录下搜索所有的文件,并打印出关键字
package blockQueue;

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockQueueTest {
    public static final int FILE_QUEUE_SIZE = 10;
    public static final int SEARCH_THREADS = 100;
    private static final File DUMMY = new File("");
    private static BlockingQueue<File> queue = new ArrayBlockingQueue<>(FILE_QUEUE_SIZE);

    public static void main(String[] args){
        try (Scanner in = new Scanner(System.in)){
            System.out.println("Enter base direcory(...)");
            String direcory = in.nextLine();
            System.out.println("Enter keywords");
            String keyword = in.nextLine();
            Runnable enumerator = () ->{
                try {
                    enumerate(new File(direcory));
                    queue.put(DUMMY);

                }catch (InterruptedException e){

                }
            };
            new Thread(enumerator).start();
            for (int i = 1; i <=SEARCH_THREADS ; i++) {
                Runnable search = ()->{
                    try {
                        boolean done = false;
                        while (!done){
                            File file = queue.take();
                            System.out.println(file);
                            if(file == DUMMY){
                                queue.put(file);
                                done = true;
                            }else search(file,keyword);
                        }
                    }catch (IOException e){
                        e.printStackTrace();
                    }catch (InterruptedException e){

                    }
                };
                new Thread(search)
                        .start();

            }

        }
    }
    public static void enumerate(File directory) throws InterruptedException{
        File[] files = directory.listFiles();
        for (File file:
             files) {
            if(file.isDirectory()) enumerate(file);
            else {
                System.out.println(file.getName());
                queue.put(file);
            }
        }
    }
    public static void search(File file,String keywords)throws IOException{
        try(Scanner in = new Scanner(file,"UTF-8")) {
            int lineNumber = 0;
            while (in.hasNextLine()){
                lineNumber++;
                String line = in.nextLine();
                if(line.contains(keywords)){
                    System.out.printf("%s;%d;%s%n", file.getPath(), lineNumber, line);
                }
            }
        }
    }
}

相关文章

  • 并发知识5

    死锁 锁和条件不能解决线程中的所有问题账户1:200; 账户2:300;线程1:从账户1转移300到账户2 线程2...

  • java并发编程知识梳理

    分享一个java并发编程知识点图谱Java并发知识图谱.png

  • 1. 导学

    1️⃣主题是什么? ① 并发编程② 高并发解决方案 2️⃣相关的知识点有什么? 并发编程相关知识点① 线程安全② ...

  • Java并发编程学习总结

    Java 并发基础知识 Java 并发的基础知识,可能会在笔试中遇到,技术面试中也可能以并发知识环节提问的第一个问...

  • 高并发编程

    并发基础知识

  • 2020-03-20

    Java并发编程学习前期知识下篇 通过上一篇《Java并发编程学习前期知识上篇》我们知道了在Java并发中的可见性...

  • Java并发编程学习前期知识下篇

    Java并发编程学习前期知识下篇 通过上一篇《Java并发编程学习前期知识上篇》我们知道了在Java并发中的可见性...

  • JUC并发编程-1.并发与高并发知识概要

    1.并发相关知识点 并发概要1.jpg 2.线程并发与安全 并发概要2.jpg 3.高并发相关 并发概要3.jpg...

  • 10.21-10.27周复盘

    一、技术学习 1.并发编程技术课程视频学习完毕,并总结知识5篇。 二、理财学习 1.巩固了可转债和打新债的知识。这...

  • 第一章

    Java并发编程与高并发解决方案知识点:线程安全;线程封闭;线程调度;同步容器;并发容器;AQS;J.UC 高并发...

网友评论

    本文标题:并发知识5

    本文链接:https://www.haomeiwen.com/subject/qwsmvftx.html