暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java 多线程的创建方式

研发生产率生态 2020-10-06
127

Java Vs OS线程

       在Hotspot JVM中,Java线程和本机操作系统(即OS)线程之间存在直接映射,在为Java线程准备状态(包括线程本地存储,缓冲区分配,创建同步对象,堆栈和程序计数器)之后,将创建本机OS线程.

       操作系统负责调度所有线程并将它们分派到任何可用的CPU。在多核CPU中,您将获得真正的并行性。当线程数超过CPU核数时,CPU会从执行一个线程切换到执行另一个线程,需要保存当前线程的本地数据、程序指针等,并加载下一个线程的本地数据、程序指针等。这种切换称为上下文切换,代价不低,您不应该进行不必要的上下文切换。

 线程终止时,将释放本机线程和Java线程的所有资源。

  • 线程的创建方法

         1. 扩展java.lang.Thread类

         2. 实现java.lang.Runnable接口

        3.  使用java.util.concurrent.Executor框架实现java.util.concurrent.Callable接口以池化线程。Java 5中添加了java.util.concurrent包

        4. 使用fork/join池。

        5. Java 8 – BaseStream.parallel()–将其用于低CPU密集型任务。所有并行流都使用公共的fork-join线程池,并且如果您提交了一个长时间运行的任务,则可以有效地阻塞池中的所有线程。

  • 实例

 1. Implementing the java.util.concurrent.Callable

 package org.cfj.mythread;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class Counter implements Callable {
private static final int THREAD_POOL_SIZE 2;
private AtomicInteger count = new AtomicInteger();
public String call() {
return Thread.currentThread().getName() " executing ..." count.incrementAndGet()//Consumer
}
public static void main(String[] argsthrows InterruptedException,
ExecutionException {
ExecutorService executor Executors
.newFixedThreadPool(THREAD_POOL_SIZE);
Counter counter = new Counter();
Future future1 executor.submit(counter)//Producer
Future future2 executor.submit(counter)//Producer
System.out.println(Thread.currentThread().getName() " executing ...");

System.out.println(future1.get());
System.out.println(future2.get());

}
}
Java 8 – BaseStream.parallel()

package org.cfj.mythread;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class MyBaseStream {
public static void main(String[] args) {
Employee[] employees = { new Employee("John", 45000),
new Employee("Peter", 65000.00),
new Employee("Sam", 85000.00)};

List<Employee> inputList = Arrays.asList(employees);
List newMutatedList = inputList.stream().parallel()
.map(x -> new Employee(x.getName(), x.getSalary() * 1.05)) // returns a new list
.collect(Collectors.toList());
System.out.println(inputList);
//[Employee [name=John, salary=45000.0], Employee [name=Peter, salary=65000.0], Employee [name=Sam, salary=85000.0]]
System.out.println(newMutatedList);
}
}


文章转载自研发生产率生态,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论