Java 并发编程中如何创建线程
简介
线程是基本的调度单位,它被包含在进程之中,是进程中的实际运作单位,它本身是不会独立存在。一个进程至少有一个线程,进程中的多个线程共享进程的资源。
Java中创建线程的方式有多种如继承Thread类、实现Runnable接口、实现Callable接口以及使用线程池的方式,线程池将在后面文章中单独介绍,这里先介绍另外三种方式。
继承Thread类
优点:在run方法里可以用this获取到当前线程。
缺点:由于Java不支持多继承,所以如果继承了Thread类后就不能再继承其他类。
public class MyThread extends Thread { /** * 线程要执行的任务 */ @Override public void run() { System.out.println("do something..."); } public static void main(String[] args) { //创建线程 MyThread myThread = new MyThread(); //启动线程 myThread.start(); } }
实现Runnable接口
优点:实现Runnable接口后不影响继承其他类,以及有利于多个线程资源共享。
缺点:获取当前线程需要调用Thread.currentThread()。
public class MyThread implements Runnable { /** * 线程要执行的任务 */ @Override public void run() { System.out.println("do something..."); } public static void main(String[] args) { //创建两个线程,并指定相同的任务 Thread thread1 = new Thread(new MyThread()); Thread thread2 = new Thread(new MyThread()); //启动线程 thread1.start(); thread2.start(); } }
实现Callable接口
优缺点类似于实现Runnable接口,但是实现Callable接口可以有返回值。
public class MyThread implements Callable<String> { /** * 线程要执行的任务,并且具有返回值 */ @Override public String call() throws Exception { System.out.println("do something..."); Thread.sleep(3000); return "我是返回值"; } public static void main(String[] args) throws ExecutionException, InterruptedException { //创建异步任务 FutureTask<String> futureTask = new FutureTask(new MyThread()); //启动线程 new Thread(futureTask).start(); //阻塞等待线程执行完成并返回结果 String result = futureTask.get(); System.out.println(result); } }
以上就是Java 并发编程中如何创建线程的详细内容,更多关于Java 创建线程的资料请关注我们其它相关文章!
相关推荐
-
Java并发编程线程间通讯实现过程详解
在Java中线程间通讯有多种方式,我这里列出一些常用方式,并用代码的方式展示他们是如何实现的: 共享变量 wait, notify,notifyAll(这3个方法是Object对象中的方法,且必须与synchronized关键字结合使用) CyclicBarrier.CountDownLatch 利用LockSupport Lock/Condition机制 管道,创建管道输出流PipedOutputStream和管道输入流PipedInputStream 示例一: package com.zhi
-
java并发编程专题(二)----如何创建并运行java线程
实现线程的两种方式 上一节我们了解了关于线程的一些基本知识,下面我们正式进入多线程的实现环节.实现线程常用的有两种方式,一种是继承Thread类,一种是实现Runnable接口.当然还有第三种方式,那就是通过线程池来生成线程,后面我们还会学习,一步一个脚印打好基础. Runnable接口: public interface Runnable { public abstract void run(); } Thread类: public class Thread implements Runnab
-
Java多线程并发编程和锁原理解析
这篇文章主要介绍了Java多线程并发编程和锁原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等方案后,问题得到解决. 加锁方案见下文. 二.乐观锁 & 悲观锁 1.乐观锁 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁
-
Java并发编程示例(十):线程组
对线程分组是Java并发API提供的一个有趣功能.我们可以将一组线程看成一个独立单元,并且可以随意操纵线程组中的线程对象.比如,可以控制一组线程来运行同样的任务,无需关心有多少线程还在运行,还可以使用一次中断调用中断所有线程的执行. Java提供了ThreadGroup类来控制一个线程组.一个线程组可以通过线程对象来创建,也可以由其他线程组来创建,生成一个树形结构的线程. 根据<Effective Java>的说明,不再建议使用ThreadGroup.建议使用Executor. --D瓜哥特此
-
Java多线程并发编程 并发三大要素
一.原子性 原子,一个不可再被分割的颗粒.原子性,指的是一个或多个不能再被分割的操作. int i = 1; // 原子操作 i++; // 非原子操作,从主内存读取 i 到线程工作内存,进行 +1,再把 i 写到朱内存. 虽然读取和写入都是原子操作,但合起来就不属于原子操作,我们又叫这种为"复合操作". 我们可以用synchronized 或 Lock 来把这个复合操作"变成"原子操作. 例子: private synchronized void increase
-
java并发编程专题(一)----线程基础知识
在任何的生产环境中我们都不可逃避并发这个问题,多线程作为并发问题的技术支持让我们不得不去了解.这一块知识就像一个大蛋糕一样等着我们去分享,抱着学习的心态,记录下自己对并发的认识. 1.线程的状态: 线程状态图: 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权. 3.运行状态(Running):就绪状态的线程获取了CPU,执行程序代码. 4
-
Java并发编程中使用Executors类创建和管理线程的用法
1. 类 Executors Executors类可以看做一个"工具类".援引JDK1.6 API中的介绍: 此包中所定义的 Executor.ExecutorService.ScheduledExecutorService.ThreadFactory 和 Callable 类的工厂和实用方法.此类支持以下各种方法: (1)创建并返回设置有常用配置字符串的 ExecutorService 的方法. (2)创建并返回设置有常用配置字符串的 ScheduledExecutorServi
-
Java 多线程并发编程_动力节点Java学院整理
一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种资源和状态信息,包括打开的文件.子进程和信号处理. 线程:表示程序的执行流程,是CPU调度执行的基本单位:线程有自己的程序计数器.寄存器.堆栈和帧.同一进程中的线程共用相同的地址空间,同时共享进进程锁拥有的内存和其他资源. 2.Java标准库提供了进程和线程相关的API,进程主要包括表示进程的jav
-
java并发编程专题(三)----详解线程的同步
有兴趣的朋友可以回顾一下前两篇 java并发编程专题(一)----线程基础知识 java并发编程专题(二)----如何创建并运行java线程 在现实开发中,我们或多或少的都经历过这样的情景:某一个变量被多个用户并发式的访问并修改,如何保证该变量在并发过程中对每一个用户的正确性呢?今天我们来聊聊线程同步的概念. 一般来说,程序并行化是为了获得更高的执行效率,但前提是,高效率不能以牺牲正确性为代价.如果程序并行化后, 连基本的执行结果的正确性都无法保证, 那么并行程序本身也就没有任何意义了.因此,
-
Java 并发编程中如何创建线程
简介 线程是基本的调度单位,它被包含在进程之中,是进程中的实际运作单位,它本身是不会独立存在.一个进程至少有一个线程,进程中的多个线程共享进程的资源. Java中创建线程的方式有多种如继承Thread类.实现Runnable接口.实现Callable接口以及使用线程池的方式,线程池将在后面文章中单独介绍,这里先介绍另外三种方式. 继承Thread类 优点:在run方法里可以用this获取到当前线程. 缺点:由于Java不支持多继承,所以如果继承了Thread类后就不能再继承其他类. public
-
深入分析java并发编程中volatile的实现原理
引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的"可见性".可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值.它在某些情况下比synchronized的开销更小,本文将深入分析在硬件层面上Inter处理器是如何实现Volatile的,通过深入分析能帮助我们正确的使用Volatile变量. 术语定义 术语 英文单词 描述 共享变量 在多个线
-
浅析Java 并发编程中的synchronized
synchronized关键字,我们一般称之为"同步锁",用它来修饰需要同步的方法和需要同步代码块,默认是当前对象作为锁的对象.在用synchronized修饰类时(或者修饰静态方法),默认是当前类的Class对象作为锁的对象,故存在着方法锁.对象锁.类锁这样的概念. 一.没有设置线程同步的情况 先给出以下代码感受下代码执行的时候为什么需要同步?代码可能比较枯燥,配上业务理解起来就会舒服很多,学生军训,有三列,每列5人,需要报数,每个线程负责每一列报数. class Synchroni
-
java并发编程中ReentrantLock可重入读写锁
目录 一.ReentrantLock可重入锁 二.ReentrantReadWriteLock读写锁 三.读锁之间不互斥 一.ReentrantLock可重入锁 可重入锁ReentrantLock 是一个互斥锁,即同一时间只有一个线程能够获取锁定资源,执行锁定范围内的代码.这一点与synchronized 关键字十分相似.其基本用法代码如下: Lock lock = new ReentrantLock(); //实例化锁 //lock.lock(); //上锁 boolean locked =
-
Java并发编程示例(五):线程休眠与恢复
有时,我们需要在指定的时间点中断正在执行的线程.比如,每分钟检查一次传感器状态的线程,其余时间,线程不需要做任何事情.在此期间,线程不需要使用计算机的任何资源.过了这段时间之后,并且当Java虚拟机调度了该线程,则该线程继续执行.为此,你可以使用Thread类的sleeep()方法.该方法以休眠的方式来推迟线程的执行,而且整数类型的参数则指明休眠的毫秒数.当调用sleep()方法,休眠时间结束后,Java虚拟机分配给线程CPU运行时间,线程就会继续执行. 另一种是用sleep()方法的方式是通过
-
Java并发编程示例(一):线程的创建和执行
开门见山 在IT圈里,每当我们谈论并发时,必定会说起在一台计算机上同时运行的一系列线程.如果这台电脑上有多个处理器或者是一个多核处理器,那么这时是实实在在的"同时运行":但是,如果计算机只有一个单核处理器,那么这时的"同时运行"只是表象而已. 所有的现代操作系统全部支持任务的并发执行.你可以边听音乐,边上网看新闻,还不耽误首发电子邮件.我们可以说,这种并发是 进程级并发 .在进程内部,我也可以看到有许许多多的并发任务.我们把运行在一个进程里面的并发任务称 线程. 和
-
详解Java多线程编程中CountDownLatch阻塞线程的方法
直译过来就是倒计数(CountDown)门闩(Latch).倒计数不用说,门闩的意思顾名思义就是阻止前进.在这里就是指 CountDownLatch.await() 方法在倒计数为0之前会阻塞当前线程. CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. CountDownLatch 的作用和 Thread.join() 方法类似,可用于一组线程和另外一组线程的协作.例如,主线程在做一项工作之前需要一系列的准备工作,只有这些准备工
-
Java并发编程中构建自定义同步工具
当Java类库没有提供适合的同步工具时,就需要构建自定义同步工具. 可阻塞状态依赖操作的结构 复制代码 代码如下: acquir lock on object state;//请求获取锁 while(precondition does not hold){//没有满足前提条件 release lock;//先释放锁 wait until precondition might hold;//等待满足前提条件 optionlly fail if interrupted or tim
随机推荐
- Delphi中使用ISuperObject解析Json数据的实现代码
- SQL注入中绕过 单引号 限制继续注入
- inst.exe,Setup.exe木马Trojan-PSW.Win32.Magania.cjy解决方法
- js获取日期:昨天今天和明天、后天
- bat批处理一键登录网易163和126邮箱
- Java concurrency集合之ConcurrentSkipListMap_动力节点Java学院整理
- PHP实现的随机IP函数【国内IP段】
- PHP使用array_fill定义多维数组的方法
- php中的curl使用入门教程和常见用法实例
- Asp 使用 Microsoft.XMLHTTP 抓取网页内容并过滤需要的
- 用C实现PHP扩展 Image_Tool 图片常用处理工具类的使用
- C++中实现把表的数据导出到EXCEL并打印实例代码
- C语言数据结构中串的模式匹配
- Mysql中校对集utf8_unicode_ci与utf8_general_ci的区别说明
- mysql的存储过程、游标 、事务实例详解
- jQuery中html()方法用法实例
- SQL Server2005下的安全操作技巧分享
- Windows Server 2003 下配置 MySQL 集群(Cluster)教程
- javascript原始值和对象引用实例分析
- Linux中利用Vim对文件进行密码保护的方法详解