GVKun编程网logo

java-并发工具类(java并发工具类)

5

如果您想了解java-并发工具类和java并发工具类的知识,那么本篇文章将是您的不二之选。我们将深入剖析java-并发工具类的各个方面,并为您解答java并发工具类的疑在这篇文章中,我们将为您介绍ja

如果您想了解java-并发工具类java并发工具类的知识,那么本篇文章将是您的不二之选。我们将深入剖析java-并发工具类的各个方面,并为您解答java并发工具类的疑在这篇文章中,我们将为您介绍java-并发工具类的相关知识,同时也会详细的解释java并发工具类的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

java-并发工具类(java并发工具类)

java-并发工具类(java并发工具类)

CountDownLatch

  • CountDownLatch是一种java.util.concurrent包下一个并发工具类,它允许一个或多个线程等待直到在其他线程中一组操作执行完成。
  • 可以控制线程的执行顺序

例子:学校操场的跑道上8位选手首先进行1000米赛跑,跑完裁判清空跑道进行跨栏比赛。

分享图片

结果:

分享图片

总结

  • CountDownLatch end = new CountDownLatch(N); //构造对象时候 需要传入参数N
  • end.await()  能够阻塞线程 直到调用N次end.countDown() 方法才释放线程
  • end.countDown() 可以在多个线程中调用  计算调用次数是所有线程调用次数的总和

 CyclicBarrier-栅栏

  • 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。
  • CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏将被重置以便下次使用。

CyclicBarrier跟countDownLatch的区别

  • CountDownLatch一般用于某个线程等待若干个其他线程执行完任务之后,它才执行;不可重复使用
  • CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;可重用的

例子:学校操场的跑道上8位选手进行1000米赛跑,只有当8位选手都到起跑线上,才能进行比赛

分享图片

 结果:

分享图片

   另一种构造函数:

分享图片

 到达某种状态时,执行Runnable的run()。

Semaphore--信号量

  • 控制并发数量
  • 常用于限制可以访问某些资源的线程数量,例如通过 Semaphore 限流
  • Semaphore 是 synchronized 的加强版,作用是控制线程的并发数量。就这一点而言,单纯的synchronized 关键字是实现不了的

构造函数

分享图片

   fair表示公平实现和非公平实现

分享图片

 结果:

分享图片

 因为设置的信号量控制数为5,所以当代码执行到Thread-3开始执行之后休眠5秒,再去执行其他的线程。

 Exchanger

  • 用于交换数据
  • 它提供一个同步点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据, 如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。因此使用Exchanger的重点是成对的线程使用exchange()方法,当有一对线程达到了同步点,就会进行交换数据。因此该工具类的线程对象是【成对】的。

分享图片

 结果:

分享图片

源代码地址:https://github.com/woxbwo/is-concurrent

### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: cn.xiaojian.blog.po.BlogType and java.lang.String ### Cause: java.lang.IllegalArgumentException: ...

### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: cn.xiaojian.blog.po.BlogType and java.lang.String ### Cause: java.lang.IllegalArgumentException: ...

### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: cn.xiaojian.blog.po.BlogType and java.lang.String
### Cause: java.lang.IllegalArgumentException: invalid comparison: cn.xiaojian.blog.po.BlogType and java.lang.String] with root cause
java.lang.IllegalArgumentException: invalid comparison: cn.xiaojian.blog.po.BlogType and java.lang.String
at org.apache.ibatis.ognl.OgnlOps.compareWithConversion(OgnlOps.java:92)
at org.apache.ibatis.ognl.OgnlOps.isEqual(OgnlOps.java:142)
at org.apache.ibatis.ognl.OgnlOps.equal(OgnlOps.java:794)
at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:53)
at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
at org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:61)
at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)
at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:494)
......

  在MVC开发中习惯使用原有的类作为传参方式:

  javaBean:

  

分享图片

 

 

   该javaBean上建立扩展类:

   

分享图片

 

 

    数据库中,blog表和blogType表存在外键关系,所以在blog类的实现上,要建立一个blogType的类做属性。

   在该查询中,显示的异常信息可知,invalid comparison: cn.xiaojian.blog.po.BlogType and java.lang.String,不能比较(blogType和String)

分享图片

 

   sql语句的拼接中,判断该类是否为空就行了,我就照着前面的一路CV,从而忽略了这个错误(根本是没注意到这样的问题)。

  所以这里要注意啊:代码套路深,CV需谨慎啊。CV自己的代码都能坑死自己啊。

  日常报错ing,吸取更多的教训,写出更优雅的代码,同时希望能帮助到同是坎坷路上的码友们。

'java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”

'java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”

如何解决''java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”?

我收到此错误,我已阅读该错误以解决它我必须将 import java.util.Base64 替换为 import android.util.Base64 但在我的整个项目中我只发现 Base68 result = Base64.getEncoder().encodetoString(macData); 的唯一用法 我该如何解决?而且我不能用 android.util.Base.64 替换 java.util.Base64 因为这行代码在后端

解决方法

这很不幸 - 这意味着您正在使用某个库,而那个库正在尝试使用 /i。 Android 选择了 Java 库,就像 android 发布时一样,现在已经是很久以前的事了。从那以后它们就没有真正更新过。 (那个 oracle v google 法庭案件可能没有帮助……)

java.util.Base64 已添加到 https://forge.autodesk.com/en/docs/design-automation/v3/reference/cmdLine/cmdLine-inventor/(有关此信息,请参阅 javadoc 中的“since”行;任何“1.6”或以下,或者如果没有“since”行,肯定可用在 android 上。其他东西通常不是)。 java 8 现在已经 7 岁了,因此不是专门为 android 设计的库越来越有可能开始使用这些非 android 库调用。

检查堆栈跟踪,您会找到正在执行此操作的库。恐怕除了停止使用这个库之外别无他法。您可以尝试在您的应用程序中粘贴 juBase64 impl,但这会相对棘手,因为这可能涉及一些法律问题,因此,要么没有人这样做,要么如果他们这样做,他们可能不会宣传如何。

您可以要求这个库使用第三方库来做 base64 工作,但他们可能不想这样做,这可能不是库无法在 android 上运行的唯一问题。

如果 android 变体是一个替代品,你可以重写这个库的类文件,但这也是一个有点笨拙、笨拙的概念,并不完全困难,但因为这不是一件正常的事情,而且通常积极不喜欢,我认为您无法轻松找到有关如何操作的文档。

因此,建议:尝试寻找另一个图书馆。

(Java 学习笔记) Java Threading (Java 线程)

(Java 学习笔记) Java Threading (Java 线程)

Java Threading (Java 线程)

● Process & Thread

Processes are the abstraction of running programs: A binary image, virtualized memory, various kernel resources, an associated security context, and so on.

Threads are the unit of execution in a process: A virtualized processor, a stack, and program state.

 

Threads are sometimes called lightweight processes. Both processes and threads provide an execution environment, but creating a new thread requires fewer resources than creating a new process.

Threads exist within a process — every process has at least one. Threads share the process''s resources, including memory and open files. This makes for efficient, but potentially problematic, communication.

 

Multithreaded execution is an essential feature of the Java platform. Every application has at least one thread — or several, if you count "system" threads that do things like memory management and signal handling. But from the application programmer''s point of view, you start with just one thread, called the main thread. This thread has the ability to create additional threads, as we''ll demonstrate in the next section.

 

● Processes

--Will by default not share memory

--Most file descriptors not shared

--Don''t share filesystem context

--Don''t share signal handling

 

● Threads

--Will by default share memory

--Will share file descriptors

--Will share filesystem context

--Will share signal handling

 

● Thread pool

Thread pool represents a group of worker threads that are waiting for the job and reuse many times,

 

● Thread life cycle & states

 

 

26. 大白话说 java 并发工具类 - Semaphore,Exchanger

26. 大白话说 java 并发工具类 - Semaphore,Exchanger

高春辉、王春生、朱峰:关于开源创业的 15 件小事

1. 控制资源并发访问 --Semaphore

Semaphore 可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源。Semaphore 就相当于一个许可证,线程需要先通过 acquire 方法获取该许可证,该线程才能继续往下执行,否则只能在该方法出阻塞等待。当执行完业务功能后,需要通过 release() 方法将许可证归还,以便其他线程能够获得许可证继续执行。

Semaphore 可以用于做流量控制,特别是公共资源有限的应用场景,比如数据库连接。假如有多个线程读取数据后,需要将数据保存在数据库中,而可用的最大数据库连接只有 10 个,这时候就需要使用 Semaphore 来控制能够并发访问到数据库连接资源的线程个数最多只有 10 个。在限制资源使用的应用场景下,Semaphore 是特别合适的。

下面来看下 Semaphore 的主要方法:

//获取许可,如果无法获取到,则阻塞等待直至能够获取为止
void acquire() throws InterruptedException 

//同acquire方法功能基本一样,只不过该方法可以一次获取多个许可
void acquire(int permits) throws InterruptedException

//释放许可
void release()

//释放指定个数的许可
void release(int permits)

//尝试获取许可,如果能够获取成功则立即返回true,否则,则返回false
boolean tryAcquire()

//与tryAcquire方法一致,只不过这里可以指定获取多个许可
boolean tryAcquire(int permits)

//尝试获取许可,如果能够立即获取到或者在指定时间内能够获取到,则返回true,否则返回false
boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException

//与上一个方法一致,只不过这里能够获取多个许可
boolean tryAcquire(int permits, long timeout, TimeUnit unit)

//返回当前可用的许可证个数
int availablePermits()

//返回正在等待获取许可证的线程数
int getQueueLength()

//是否有线程正在等待获取许可证
boolean hasQueuedThreads()

//获取所有正在等待许可的线程集合
Collection<Thread> getQueuedThreads()

另外,在 Semaphore 的构造方法中还支持指定是够具有公平性,默认的是非公平性,这样也是为了保证吞吐量。

一个例子

下面用一个简单的例子来说明 Semaphore 的具体使用。我们来模拟这样一样场景。有一天,班主任需要班上 10 个同学到讲台上来填写一个表格,但是老师只准备了 5 支笔,因此,只能保证同时只有 5 个同学能够拿到笔并填写表格,没有获取到笔的同学只能够等前面的同学用完之后,才能拿到笔去填写表格。该示例代码如下:

public class SemaphoreDemo {

    //表示老师只有10支笔
    private static Semaphore semaphore = new Semaphore(5);

    public static void main(String[] args) {

        //表示50个学生
        ExecutorService service = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            service.execute(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + "  同学准备获取笔......");
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "  同学获取到笔");
                    System.out.println(Thread.currentThread().getName() + "  填写表格ing.....");
                    TimeUnit.SECONDS.sleep(3);
                    semaphore.release();
                    System.out.println(Thread.currentThread().getName() + "  填写完表格,归还了笔!!!!!!");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        service.shutdown();
    }

}
输出结果:

pool-1-thread-1  同学准备获取笔......
pool-1-thread-1  同学获取到笔
pool-1-thread-1  填写表格ing.....
pool-1-thread-2  同学准备获取笔......
pool-1-thread-2  同学获取到笔
pool-1-thread-2  填写表格ing.....
pool-1-thread-3  同学准备获取笔......
pool-1-thread-4  同学准备获取笔......
pool-1-thread-3  同学获取到笔
pool-1-thread-4  同学获取到笔
pool-1-thread-4  填写表格ing.....
pool-1-thread-3  填写表格ing.....
pool-1-thread-5  同学准备获取笔......
pool-1-thread-5  同学获取到笔
pool-1-thread-5  填写表格ing.....


pool-1-thread-6  同学准备获取笔......
pool-1-thread-7  同学准备获取笔......
pool-1-thread-8  同学准备获取笔......
pool-1-thread-9  同学准备获取笔......
pool-1-thread-10  同学准备获取笔......


pool-1-thread-4  填写完表格,归还了笔!!!!!!
pool-1-thread-9  同学获取到笔
pool-1-thread-9  填写表格ing.....
pool-1-thread-5  填写完表格,归还了笔!!!!!!
pool-1-thread-7  同学获取到笔
pool-1-thread-7  填写表格ing.....
pool-1-thread-8  同学获取到笔
pool-1-thread-8  填写表格ing.....
pool-1-thread-1  填写完表格,归还了笔!!!!!!
pool-1-thread-6  同学获取到笔
pool-1-thread-6  填写表格ing.....
pool-1-thread-3  填写完表格,归还了笔!!!!!!
pool-1-thread-2  填写完表格,归还了笔!!!!!!
pool-1-thread-10  同学获取到笔
pool-1-thread-10  填写表格ing.....
pool-1-thread-7  填写完表格,归还了笔!!!!!!
pool-1-thread-9  填写完表格,归还了笔!!!!!!
pool-1-thread-8  填写完表格,归还了笔!!!!!!
pool-1-thread-6  填写完表格,归还了笔!!!!!!
pool-1-thread-10  填写完表格,归还了笔!!!!!!

根据输出结果进行分析,Semaphore 允许的最大许可数为 5,也就是允许的最大并发执行的线程个数为 5,可以看出,前 5 个线程(前 5 个学生)先获取到笔,然后填写表格,而 6-10 这 5 个线程,由于获取不到许可,只能阻塞等待。当线程 pool-1-thread-4 释放了许可之后,pool-1-thread-9 就可以获取到许可,继续往下执行。对其他线程的执行过程,也是同样的道理。从这个例子就可以看出,Semaphore 用来做特殊资源的并发访问控制是相当合适的,如果有业务场景需要进行流量控制,可以优先考虑 Semaphore。

2. 线程间交换数据的工具 --Exchanger

Exchanger 是一个用于线程间协作的工具类,用于两个线程间能够交换。它提供了一个交换的同步点,在这个同步点两个线程能够交换数据。具体交换数据是通过 exchange 方法来实现的,如果一个线程先执行 exchange 方法,那么它会同步等待另一个线程也执行 exchange 方法,这个时候两个线程就都达到了同步点,两个线程就可以交换数据。

Exchanger 除了一个无参的构造方法外,主要方法也很简单:

//当一个线程执行该方法的时候,会等待另一个线程也执行该方法,因此两个线程就都达到了同步点
//将数据交换给另一个线程,同时返回获取的数据
V exchange(V x) throws InterruptedException

//同上一个方法功能基本一样,只不过这个方法同步等待的时候,增加了超时时间
V exchange(V x, long timeout, TimeUnit unit)
    throws InterruptedException, TimeoutException 

一个例子

Exchanger 理解起来很容易,这里用一个简单的例子来看下它的具体使用。我们来模拟这样一个情景,在青春洋溢的中学时代,下课期间,男生经常会给走廊里为自己喜欢的女孩子送情书,相信大家都做过这样的事情吧 :)。男孩会先到女孩教室门口,然后等女孩出来,教室那里就是一个同步点,然后彼此交换信物,也就是彼此交换了数据。现在,就来模拟这个情景。

public class ExchangerDemo {
    private static Exchanger<String> exchanger = new Exchanger();

    public static void main(String[] args) {

        //代表男生和女生
        ExecutorService service = Executors.newFixedThreadPool(2);

        service.execute(() -> {
            try {
                //男生对女生说的话
                String girl = exchanger.exchange("我其实暗恋你很久了......");
                System.out.println("女孩儿说:" + girl);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        service.execute(() -> {
            try {
                System.out.println("女生慢慢的从教室你走出来......");
                TimeUnit.SECONDS.sleep(3);
                //男生对女生说的话
                String boy = exchanger.exchange("我也很喜欢你......");
                System.out.println("男孩儿说:" + boy);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

    }
}

输出结果:

女生慢慢的从教室你走出来......
男孩儿说:我其实暗恋你很久了......
女孩儿说:我也很喜欢你......

这个例子很简单,也很能说明 Exchanger 的基本使用。当两个线程都到达调用 exchange 方法的同步点的时候,两个线程就能交换彼此的数据。

我们今天的关于java-并发工具类java并发工具类的分享已经告一段落,感谢您的关注,如果您想了解更多关于### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: cn.xiaojian.blog.po.BlogType and java.lang.String ### Cause: java.lang.IllegalArgumentException: ...、'java.lang.NoClassDefFoundError 由 java.lang.ClassNotFoundException 引起的 Ljava/util/Base64 解析失败 未找到类“java.util.Base64”、(Java 学习笔记) Java Threading (Java 线程)、26. 大白话说 java 并发工具类 - Semaphore,Exchanger的相关信息,请在本站查询。

本文标签: