前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并发知识5

并发知识5

作者头像
用户2436820
发布2018-09-05 10:28:27
3360
发布2018-09-05 10:28:27
举报

死锁

锁和条件不能解决线程中的所有问题 账户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方法获取其他线程的锁可能会发生阻塞,应该更加安全的申请锁

代码语言:javascript
复制
    if(myLock.tryLock()){
        try{
        }finnally{
          myLock.unlock();
        }
    }else{
        // do something else
    }
  //  设置超时
  myLock.tryLock(100,TineUnit.MILLISECONDS)

弃用的方法

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

阻塞队列

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

  • 生产者线程向队列插入元素,消费者线程则取出它们
  • 使用队列可以安全的从一个线程向另一个线程传递数据 我们使用阻塞队列来控制一组线程,程序在它的一个目录和所有子目录下搜索所有的文件,并打印出关键字
代码语言:javascript
复制
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);
                }
            }
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.08.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 死锁
  • 线程局部变量
  • 锁测试与超时
  • 弃用的方法
  • 阻塞队列
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档