一、继承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. 使用Flutter完成10个商业项目后的经验教训

    作者:Łukasz Kosman 和 Jakub Wojtczak 原文:https://medium.com/swlh/lessons-learned-after-making-the-first- ...

  2. 我要吹爆这份阿里中间件技术内部的RM笔记,简直佩服到五体投地

    消息队列 RocketMQ 版是阿里云基于 Apache RocketMQ 构建的低延迟.高并发.高可用.高可靠的分布式消息中间件.该产品最初由阿里巴巴自研并捐赠给 Apache 基金会,服务于阿里集 ...

  3. Processing 网格(棋盘格)无限偏移纹理动画

    过火 再度出击!这次我们要玩得更火一点---把静帧变动画.没错,将棋盘格动起来!看一下效果: 这是一个经典的无限偏移动画,在很多2d横版射击游戏中都会采用的技术.如何在Processing中实现,有两 ...

  4. 实践案例丨利用小熊派开发板获取土壤湿度传感器的ADC值

    摘要:一文带你用小熊派开发板动手做土壤湿度传感器. 一.实验准备 1.实验环境 一块stm32开发板(推荐使用小熊派),以及数据线 已经安装STM32CubeMX 已经安装KeilMDK,并导入stm ...

  5. jquery全选,全不选,反选

    前台 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.o ...

  6. gateway(二、过滤器)

    过滤器其实是路由转发+过滤器 自定义过滤器 首先创建一个类继承下边两个类,实现过滤器 然后在启动项中通过创建bean的方式创建路由器 @Componentpublic class TimeFilter ...

  7. Hbuilder获取手机当前地理位置的天气

    前言:前面一段时间,公司项目里有一个需求 是获取当前手机地理位置当天的天气情况  将实时天气信息提供给客户.在网上搜索资料时候,发现知识很零碎,自己实现以后整理出来,方便于各位的学习与使用. 一.获取 ...

  8. C++ 中explicit的作用

    转载:https://www.cnblogs.com/diligenceday/p/5781408.html C++ 中explicit的作用   explicit作用: 在C++中,explicit ...

  9. matlab中bitshift 将位移动指定位数

    来源:https://ww2.mathworks.cn/help/matlab/ref/bitshift.html?searchHighlight=bitshift&s_tid=doc_src ...

  10. Java 从现在到次日零时还剩余多少秒

    参考:计算从现在到凌晨00:00还剩余多少秒 应用场景:某些应用需要在特定的时间点更新数据 1 import java.text.DateFormat; 2 import java.text.Simp ...