TomorrowLi's Blog


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

java两个线程数据交换

发表于 2022-06-10 | 分类于 多线程
字数统计: 302 | 阅读时长 ≈ 1

         java.util.concurrent.Exchanger可以用来进行数据交换,或者被称为“数据交换器”。两个线程可以使用Exchanger交换数据。Exchanger(交换者)是一个用于线程间写作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange()交换数据,如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange(),当连个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。

package com.semaphore;

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExchangerTest {

    private static final Exchanger<String> exgr = new Exchanger<String>();

    private static ExecutorService threadPool = Executors.newFixedThreadPool(2);

    public static void main(String[] args) {

        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    String A = "银行流水A";// A录入银行流水数据
                    System.out.println("本来是" + A + "变成了" + exgr.exchange(A));
                } catch (InterruptedException e) {
                }
            }
        });

        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    String B = "银行流水B";// B录入银行流水数据
                    System.out.println("本来是" + B + "变成了" + exgr.exchange(B));
                } catch (InterruptedException e) {
                }
            }
        });

        threadPool.shutdown();

    }
}

java多线程如何实现顺序访问

发表于 2022-06-10 | 分类于 多线程
字数统计: 732 | 阅读时长 ≈ 3

1、通过join()方法指定顺序

     当然,thread的join方法实现多线程顺序执行有两种方式,一种是在子线程内部调用join()方法,另一种是直接在主线程调用join()方法;写法上是主线程上调用join()更直观,谁先执行谁后执行一目了然。子线程内部调用的话,相对的要注意调用的顺序。

1.子线程内部调用join()

public class ThreadJoinDemo {
    public static void main(String[] args) throws InterruptedException {
        final Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("打开冰箱!");
            }
        });

        final Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    thread1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("拿出一瓶牛奶!");
            }
        });

        final Thread thread3 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    thread2.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("关上冰箱!");
            }
        });

        //下面三行代码顺序可随意调整,程序运行结果不受影响,因为我们在子线程中通过“join()方法”已经指定了运行顺序(还有一个原因就是之前说的多线程的生命周期中有就绪状态,需要等待cpu调度,start并不意味着运行状态)。
        thread3.start();
        thread2.start();
        thread1.start();
    }
}
阅读全文 »

jetBrains2020.x破解

发表于 2022-06-08 | 分类于 破解软件
字数统计: 28 | 阅读时长 ≈ 1

参考链接

1、破解资料

  1. 百度网盘下载

    地址:https://pan.baidu.com/s/1jMnfsXYH16n71vs6-WMTEA
    密码:y4b4

利用线程池解析大文件

发表于 2022-05-31 | 分类于 线程池
字数统计: 1,287 | 阅读时长 ≈ 7
  1. ReadFileThread

      public class ReadFileThread extends Thread {
    
     private ReaderFileListener processPoiDataListeners;
     private String filePath;
     private long start;
     private long end;
    
     public ReadFileThread(ReaderFileListener processPoiDataListeners,long start,long end,String file) {
         this.setName(this.getName()+"-ReadFileThread");
         System.out.println(this.getName());
         this.start = start;
         this.end = end;
         this.filePath = file;
         this.processPoiDataListeners = processPoiDataListeners;
     }
    
     @Override
     public void run() {
         ReadFile readFile = new ReadFile();
         readFile.setReaderListener(processPoiDataListeners);
         readFile.setEncode(processPoiDataListeners.getEncode());
     //  readFile.addObserver();
         try {
             readFile.readFileByLine(filePath, start, end + 1);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    

    }

阅读全文 »

HashMap 与 ConcurrentHashMap 的实现原理是怎样的?ConcurrentHashMap 是如何保证线程安全的?

发表于 2022-05-11 | 分类于 面试题
字数统计: 1,848 | 阅读时长 ≈ 7

TopK面试题

1、HashMap的底层数据结构?

HashMap底层数据结构 JDK1.7:数组+链表 JDK1.8:数组+链表+红黑树。每个数组都会有Key-value的值。java7是Entry,java8是Node。当链表长度大于8并且数组的长度大于64会转换为红黑树。
阅读全文 »

Java 中垃圾回收机制中如何判断对象需要回收?常见的 GC 回收算法有哪些?

发表于 2022-05-06 | 分类于 面试题
字数统计: 1,537 | 阅读时长 ≈ 5

TopK面试题

1、中垃圾回收机制中如何判断对象需要回收

  1. 引用计数算法(Reference Counting)

            在对象(对象头)中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一; 当引用失效时,计数器值就减一; 任何时刻计数器为零的对象就是不可能再被使用的。引用计数算法虽然占用了一些额外的内存空间来进行计数,但它的原理简单,判定效率也很高,在大多数情况下它都是一个不错的算法。这个看似简单的算法有很多例外情况要考虑,必须要配合大量额外处理才能保证正确地工作,譬如单纯的引用计数就很难解决对象之间相互循环引用的问题。

阅读全文 »

2021新篇章

发表于 2021-07-20 | 分类于 往事
字数统计: 53 | 阅读时长 ≈ 1

启程

        经过两年的停更,今天决定重新开始。这两年中由于种种原因,不能继续下去。有过快乐,有过悲伤。有舍有得。总之受益良多。加油!!!

爬取网站的种子链接并下载视频到本地

发表于 2021-07-18 | 分类于 爬虫
字数统计: 360 | 阅读时长 ≈ 2
想要密码,请联系我
阅读全文 »

通过知乎抓取粉丝

发表于 2021-07-18
字数统计: 227 | 阅读时长 ≈ 1
想要密码,请联系我
阅读全文 »

用正则表达式来爬取某论坛的邮箱地址

发表于 2021-07-18 | 分类于 爬虫
字数统计: 101 | 阅读时长 ≈ 1

代码演示:

import re

import requests
def fand_email(url,counts):
    data=requests.get(url)
    content=data.text
    pattern = r'[0-9a-zA-Z._]+@[0-9a-zA-Z._]+\.[0-9a-zA-Z._]+'
    p = re.compile(pattern)
    m = p.findall(content)
    with open('emal.txt','a+') as f:
        for i in m:
            f.write(i+'\n')
            print(i)
            counts= counts+1
    return counts
def main():
    counts=0
    numbers=0
    for i in range(1,32):
        url='http://tieba.baidu.com/p/2314539885?pn=%s'% i
        number=fand_email(url,counts)
        numbers=numbers+number
    print(numbers)
if __name__ == '__main__':
    main()
12…5<i class="fa fa-angle-right"></i>

43 日志
13 分类
37 标签
RSS
GitHub E-Mail ZhiHu
推荐阅读
  • 静觅
  • 廖雪峰python教程
  • stormzhang
  • Howiezhao
  • PyZh
  • Python最佳实践指南
  • 敖丙
  • Top K
© 2022 TomorrowLi
本站访客数:
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.3
博客全站共23.0k字