一、继承Thread类

 1 package com.jenne.mydemo;
2
3 public class TestMyThread {
4 public static void main(String[] args) {
5
6 //启动两个线程
7 MyThread my1 = new MyThread();
8 my1.start();
9 MyThread my2 = new MyThread();
10 my2.start();
11 for (int i = 10; i >= 1; i--) {
12 System.out.println(Thread.currentThread().getName() + "线程:======" + i);
13 }
14
15 }
16 }
17
18 //创建线程类
19 class MyThread extends Thread {
20 @Override
21 public void run() {
22 for (int i = 1; i <= 10; i++) {
23 System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
24 }
25 }
26 }

二、实现Runnable接口

 1 package com.jenne.mydemo;
2
3 public class TestMyThread {
4 public static void main(String[] args) {
5
6 //启动两个线程
7 MyThread my1 = new MyThread();
8 my1.start();
9 MyThread my2 = new MyThread();
10 my2.start();
11
12 //主线程运行程序
13 for (int i = 10; i >= 1; i--) {
14 System.out.println(Thread.currentThread().getName() + "线程:======" + i);
15 }
16
17 }
18 }
19
20 //创建线程类
21 class MyThread extends Thread {
22 @Override
23 public void run() {
24 for (int i = 1; i <= 10; i++) {
25 System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
26 }
27 }
28 }

三、实现Callable接口

package com.jenne.mydemo;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; /**
* Callable<V>接口使用过程:
* 1.创建资源类实现Callable接口,可以设置不同的泛型
* 2.注意Callable不能直接使用,要用第三方类(java.util.concurrent.FutureTask<V>是Runnable接口的实现类)间接实现跟Thread的链接
* 3.创建中间类:FutureTask<Object> ft = new FutureTask<Object>(new MyCallable());
* 执行使用new Thread(ft).start();
*/ public class TestMyCallable {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<Object> ft = new FutureTask<Object>(new MyCallable());
FutureTask<Object> ft1 = new FutureTask<Object>(new MyCallable()); //开启两个线程
new Thread(ft).start();
new Thread(ft1).start(); //主线程
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
} //获取call()方法的返回值
System.out.println(ft.get());
System.out.println(ft1.get());
}
} class MyCallable implements Callable<Object> { @Override
public Object call() throws Exception {
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
}
return "我是返回值";
}
}

四、线程池创建线程

package com.jenne.mydemo;

import org.junit.jupiter.api.Test;

import java.util.concurrent.*;

/**
* 使用Executors工厂类里面的静态方法创建不同的线程池
*   1.创建一个线程池,池里有nThreads个固定的线程
*   public static ExecutorService newFixedThreadPool(int nThreads)
*
*   2.一个任务一个任务的执行,池中只有一个线程
*   public static ExecutorService newSingleThreadExecutor()
*
*   3.池中没有线程,线程池根据需要创建新线程,可扩容,遇强则强
*   public static ExecutorService newCachedThreadPool()
*
* 上述三种使用很少,一般使用自定义线程池java.util.concurrent.ThreadPoolExecutor类:
*  public ThreadPoolExecutor(
*   int corePoolSize, 线程池中的常驻核心线程数
*   int maximumPoolSize, 线程池中能够容纳同时执行的最大线程数,此值必须大于等于1
*   long keepAliveTime, 多余的空闲线程的存活时间当前池中线程数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余线程会被销毁直到只剩下corePoolSize个线程为止
*   TimeUnit unit, keepAliveTime的单位.例:[TimeUnit.SECONDS.sleep(3)]等待3秒
*   BlockingQueue<Runnable> workQueue, 任务队列,被提交但尚未被执行的任务。(后面讲这个阻塞队列)
*   ThreadFactory threadFactory, 表示生成线程池中工作线程的线程工厂,用于创建线程,一般默认的即可
*   RejectedExecutionHandler handler 拒绝策略,表示当队列满了,并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来拒绝请求执行的runnable的策略)
*
* 拒绝策略(实现了 java.util.concurrent.RejectedExecutionHandle接口【当需要执行的线程数量大于maximumPoolSize+workQueue的数量会执行拒绝策略】):
*   AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行
*   CallerRunsPolicy:“调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。
*   DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加人队列中尝试再次提交当前任务。
*   DiscardPolicy:该策略默默地丢弃无法处理的任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种策略。
*/
public class TestMyExecutorService { @Test
public void testFixedThreadPool() {
ExecutorService es = Executors.newFixedThreadPool(3); //调用submit(new Runnable() )方法开启线程,
for (int i = 1; i <= 10; i++) {
es.submit(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
}
}
});
} //main线程执行代码
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
} //关闭线程池,使用后线程池被摧毁
es.shutdown();
} @Test
public void testSingleThreadExecutor() {
ExecutorService es = Executors.newSingleThreadExecutor(); //调用submit(new Runnable() )方法开启线程,
for (int i = 1; i <= 10; i++) {
es.submit(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
}
}
});
} //main线程执行代码
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
} //关闭线程池,使用后线程池被摧毁
es.shutdown();
} @Test
public void testCachedThreadPool() {
ExecutorService es = Executors.newCachedThreadPool(); //调用submit(new Runnable() )方法开启线程,
for (int i = 1; i <= 10; i++) {
es.submit(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
}
}
});
} //main线程执行代码
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
} //关闭线程池,使用后线程池被摧毁
es.shutdown();
} @Test
public void testThreadPoolExecutor() { ExecutorService es = new ThreadPoolExecutor(
2,
5,
3L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(3),
Executors.defaultThreadFactory(),
//new ThreadPoolExecutor.DiscardPolicy()
//new ThreadPoolExecutor.DiscardOldestPolicy()
new ThreadPoolExecutor.CallerRunsPolicy()
//new ThreadPoolExecutor.AbortPolicy()
); try {
for (int i = 1; i <= 10; i++) {
es.submit(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "线程:======");
}
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭线程池,使用后线程池被摧毁
es.shutdown();
}
}
}

JUC---00创建线程的方式的更多相关文章

  1. Java 创建线程的方式

    想必大家在Java面试中经常会被问到有关线程的问题,最常见的莫过于“Java有哪几种创建线程的方式呢?” 稍稍了解过,或者在日常开发中也都会用到以下几种方式: ①继承Thread类(真正意义上的线程类 ...

  2. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  3. Java多线程学习总结--线程概述及创建线程的方式(1)

    在Java开发中,多线程是很常用的,用得好的话,可以提高程序的性能. 首先先来看一下线程和进程的区别: 1,一个应用程序就是一个进程,一个进程中有一个或多个线程.一个进程至少要有一个主线程.线程可以看 ...

  4. 7. Callable 创建线程的方式三

    package com.gf.demo06; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionEx ...

  5. java线程(1)——三种创建线程的方式

    前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...

  6. java线程——三种创建线程的方式

    前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...

  7. java中创建线程的方式

    创建线程的方式: 继承thread 实现runnable 线程池 FurureTask/Callable 第一种:继承thread demo1: public class demo1 { public ...

  8. Java之创建线程的方式四:使用线程池

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

  9. Java之创建线程的方式三:实现Callable接口

    import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util ...

  10. 创建线程的方式三:实现Callable接口-----JDK5.0 新增

    package com.yhqtv.java2; /* * 创建线程的方式三:实现Callable接口-----JDK5.0 新增 * * 如何理解实现Callable接口的方式创建多线程比实现Run ...

随机推荐

  1. Android开发中导入第三方库所遇问题记录

    1.重复循环依赖的问题 (1)需求 如下图所示: 在Android 项目中,采用模块化开发,一个是主跑application--Mudule A,另外一个是library--Library B 1)M ...

  2. 关于SpringBoot的一点笔记

    @SpringBootApplication /** * @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用 */ @SpringBootAppl ...

  3. Vue 分支循环

    分支循环 在Vue中,分支循环也是使用标签属性指令完成的,这一点与后端模板语法不太相同. v-for 下面是通过v-for进行循环,不光可以拿到元素本身,也可以拿到索引值. 如果数据是对象类型,则可以 ...

  4. JUC 常用4大并发工具类

    什么是JUC? JUC就是java.util.concurrent包,这个包俗称JUC,里面都是解决并发问题的一些东西 该包的位置位于java下面的rt.jar包下面 4大常用并发工具类: Count ...

  5. Centos-获取远程主机对应端口信息-telnet

    telnet 通过 telnet协议与远程主机通信或者获取远程主机对应端口信息 格式 telnet URL/IP port

  6. Regression trees树回归 以及其他

    https://www.cnblogs.com/wuliytTaotao/p/10724118.html 选 weighted variance 最小的 但是weighted variance是怎么计 ...

  7. Spring循环依赖的问题

      什么是循环依赖?就是两个Bean相互引用,比如用@Autowire 相互注入.   那么Spring是如何解决这个问题的呢?在Bean还未完全实例化前(类只实例化了一部分),将bean提前暴露出来 ...

  8. 给子元素设置margin-top无效果的一种解决方法

    在写一个登陆界面的时候,设置登录按钮的margin-top时出了问题 先是这么写的 <div style="margin-top:30px"> <a style= ...

  9. 081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字

    081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字 本文知识点:new关键字 说明:因为时间紧张,本人写博客过程中只是 ...

  10. Dotnet Core使用特定的SDK&Runtime版本

    Dotnet Core的SDK版本总在升级,怎么使用一个特定的版本呢?   假期过完了,心情还在.今天写个短的. 一.前言 写这个是因为昨天刷微软官方文档,发现global.json在 SDK 3.0 ...