线程的创建两种方式

创建线程有四种方式,今天主要演示的是两种:继承Thread,实现Runable接口

继承Thread创建线程

import lombok.extern.slf4j.Slf4j;

@Slf4j
class MyThread extends Thread{
private int count=0;
@Override
public void run(){
for(int i=0;i<10;i++){
if(count<10){
log.info("{} :counter ={}",this.getName(),count++);
} } } }
@Slf4j
public class ThreadTest {
public static void main(String[] args) {
MyThread m1=new MyThread();
MyThread m2=new MyThread();
m1.start();
m2.start();
}
}

测试结果

2019-07-24 14:25:22,725   [Thread-0] INFO  MyThread  - Thread-0 :counter =0
2019-07-24 14:25:22,725 [Thread-1] INFO MyThread - Thread-1 :counter =0
2019-07-24 14:25:22,725 [Thread-1] INFO MyThread - Thread-1 :counter =1
2019-07-24 14:25:22,725 [Thread-1] INFO MyThread - Thread-1 :counter =2
2019-07-24 14:25:22,725 [Thread-0] INFO MyThread - Thread-0 :counter =1
2019-07-24 14:25:22,725 [Thread-0] INFO MyThread - Thread-0 :counter =2
2019-07-24 14:25:22,725 [Thread-1] INFO MyThread - Thread-1 :counter =3
2019-07-24 14:25:22,725 [Thread-0] INFO MyThread - Thread-0 :counter =3
2019-07-24 14:25:22,725 [Thread-1] INFO MyThread - Thread-1 :counter =4
2019-07-24 14:25:22,725 [Thread-1] INFO MyThread - Thread-1 :counter =5
2019-07-24 14:25:22,725 [Thread-1] INFO MyThread - Thread-1 :counter =6
2019-07-24 14:25:22,725 [Thread-1] INFO MyThread - Thread-1 :counter =7
2019-07-24 14:25:22,725 [Thread-1] INFO MyThread - Thread-1 :counter =8
2019-07-24 14:25:22,725 [Thread-1] INFO MyThread - Thread-1 :counter =9
2019-07-24 14:25:22,725 [Thread-0] INFO MyThread - Thread-0 :counter =4
2019-07-24 14:25:22,741 [Thread-0] INFO MyThread - Thread-0 :counter =5
2019-07-24 14:25:22,741 [Thread-0] INFO MyThread - Thread-0 :counter =6
2019-07-24 14:25:22,741 [Thread-0] INFO MyThread - Thread-0 :counter =7
2019-07-24 14:25:22,741 [Thread-0] INFO MyThread - Thread-0 :counter =8
2019-07-24 14:25:22,741 [Thread-0] INFO MyThread - Thread-0 :counter =9 Process finished with exit code 0

说明

两个线程,各自的变量,交替运行

实现Runable接口创建线程

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class RunableTest {
public static void main(String[] args) {
//内部类寄生于外部类,需要先创建外部类的对象
RunableTest test = new RunableTest();
MyThread m1 = test.new MyThread();
//两个线程共享一个对象
Thread t1 = new Thread(m1);
Thread t2 = new Thread(m1);
t1.start();
t2.start(); } class MyThread implements Runnable {
public int count = 0; @Override
public void run() {
for (int i = 0; i < 10; i++) {
//runable只继承了getClass方法
if(count<10){
log.info("{} :counter ={}", Thread.currentThread().getName(), count++);
} }
}
} }

测试结果


2019-07-24 14:26:40,722 [Thread-1] INFO RunableTest - Thread-1 :counter =1
2019-07-24 14:26:40,722 [Thread-0] INFO RunableTest - Thread-0 :counter =0
2019-07-24 14:26:40,737 [Thread-0] INFO RunableTest - Thread-0 :counter =3
2019-07-24 14:26:40,737 [Thread-0] INFO RunableTest - Thread-0 :counter =4
2019-07-24 14:26:40,737 [Thread-0] INFO RunableTest - Thread-0 :counter =5
2019-07-24 14:26:40,737 [Thread-0] INFO RunableTest - Thread-0 :counter =6
2019-07-24 14:26:40,737 [Thread-0] INFO RunableTest - Thread-0 :counter =7
2019-07-24 14:26:40,737 [Thread-0] INFO RunableTest - Thread-0 :counter =8
2019-07-24 14:26:40,737 [Thread-0] INFO RunableTest - Thread-0 :counter =9
2019-07-24 14:26:40,737 [Thread-1] INFO RunableTest - Thread-1 :counter =2 Process finished with exit code 0

说明

两个线程,共享一个对象,交替运行。

java并发(一):初探线程的创建的更多相关文章

  1. Java并发编程:线程的创建

    Java并发编程:线程的创建 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} J ...

  2. java并发编程基础——线程的创建

    一.基础概念 1.进程和线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据 ...

  3. Java并发基础:线程的创建

    线程的创建和管理: 1.应用Thread类显式创建.管理线程 2.应用Executor创建并管理线程. 定义任务: 无返回的任务:实现Runnable接口并编写run()方法. 有响应的任务:实现Ca ...

  4. Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  5. Java并发编程:线程池的使用(转)

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  6. Java并发编程:线程控制

    在上一篇文章中(Java并发编程:线程的基本状态)我们介绍了线程状态的 5 种基本状态以及线程的声明周期.这篇文章将深入讲解Java如何对线程进行状态控制,比如:如何将一个线程从一个状态转到另一个状态 ...

  7. Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  8. Java并发编程:线程池的使用(转载)

    转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  9. Java并发编程:线程池的使用(转载)

    文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  10. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

随机推荐

  1. mysql-8.0.18-winx64 环境变量的配置

    1. 鼠标右击   此电脑    -->属性 如图:进行步骤 1->2->3 接下来就可以使用命令mysql  -u  root  -p登录mysql了 启动mysql的命令为net ...

  2. onblur事件和onfocus事件失效

    先看onblur事件和onfocus事件的定义: <element onblur="SomeJavaScriptCode"> <element onfocus=& ...

  3. rf 环境

    googlechrome webdriver驱动下载 addrhttps://sites.google.com/a/chromium.org/chromedriver/downloads谷歌浏览器ap ...

  4. svn服务器IP/URL地址更换,修改本地的仓库地址

    TortoiseSVN服务器ip地址修改后如何使用_windows和linux下svn切换新仓库地址的方法 windows下svn切换仓库地址 右键项目文件夹 TortoiseSVN => Re ...

  5. 简单的单元测试unittest实例

    unittest是Python中自带的一个单元测试模块,常常用它来做单元测试,它里面封装了用例的初始化操作和执行,以及返回结果的校验等操作. 在学习unittest框架之前需要先了解几个知识点: Te ...

  6. notepad++ java编码,输出中文字符时,编译出错

    呆在公司中,最近受开发手机app的几个同事影响,想学android的开发,心血来潮,挡也挡不住,说干就干,直接看教程,发现有很多关于java的语法知识不懂,于是又来学java,学习的过程中难免出现问题 ...

  7. Python os模块、os.path模块常用方法

    os模块:os模块在python中包含普遍的操作系统功能,下面列出了一些在os模块中比较有用的部分. os.sep 可以取代操作系统特定的路径分隔符.windows下为 "\" o ...

  8. Android系统架构(图解)

    下图是 Android 操作系统的架构,架构包括 4 层,由上到下依次是应用程序层.应用程序框架层.核心类库和 Linux 内核.其中,核心类库中包含系统库及 Android 运行环境. 图1  An ...

  9. 解决mysql和navicat乱码问题

    1,首先进入mysql的my.ini文件,进行编码修改,全部改成utf8编码(这里就不赘述了,网上一搜一堆) 2,最重要的一点,把原先navicat创建的连接断开,重新创建新连接,在该新连接下创建库, ...

  10. Nexus-vPC与FHRP

    去往vPC的流量,如何可能将会被本地的vPC成员端口所转发.FHRP的行为是被修改的,所有的FHRP路由器都会主动转发从vPC收到的流量.修改结果:如果可能,流量避免使用Peer link,这样创建一 ...