Java : java基础(4) 线程

java开启多线程的方式,第一种是新建一个Thread的子类,然后重写它的run()方法就可以,调用类的对象的start()方法,jvm就会新开一个线程执行run()方法.

第二种是类实现Runable接口,然后重写run()方法,把这个类的对象当做参数传递给线程的构造函数.如 new Thread(xxx),xxx就是实现了Runable的类,这种方法会把xxx赋值给一个成员变量target,Thread的run方法会判断这个成员变量如果不为空,那么就会执行target.run()方法.

还有两种方法,一种是使用匿名内部类, new Thread() { public void run(){} }.start(); 在匿名内部类中重写run()方法.也可以在Thread新建时给构造函数传一个Runable接口的匿名内部类对象.如 new Thread(new Runnable() { public void run(){} }).start();上边一种是Thread的匿名内部类对象,下面一种是Runnable接口的匿名内部类对象.

另一种是new Thread的时候传递进去一个lambda表达式,如:new Thread(() -> { xxx }).start();

可以用 new Thread("name") 用构造函数给线程设置名字,也可以用 setName()方法设置名字,用getName()方法获取线程名字,在线程内的run()方法中可以用 this.getName()的方式获取当前线程名字. 用Thread.currentThread()方法可以获取当前线程的引用.

休眠线程: Thread.sleep(),可以让线程休眠多少毫秒.多少毫秒之后再运行.
守护线程: thread.setDaemon(true) 把一个线程设置为守护线程,当别的所有线程执行完之后,守护线程强制退出.
加入线程: 在线程2中某个地方加入thread1.join()方法,则线程2会在这个地方停止,等待线程1执行完成之后再继续执行.join方法还可以指定时间,让thread1执行多少毫秒.
礼让线程: thread.yield()方法可以让当前线程让出CPU,即让CPU先去执行别的任务.(有效果,但不是很明显)

线程默认优先级为5 最小优先级为1,最大优先级为10,可以用setPriority()方法设置优先级.Thread.MAX_PRIORITY是常量10,Thread.MIN_PRIORITY是常量1.

synchronized() { } 是同步代码块,里面的代码是同步执行的,小括号里是锁,可以任意声明一个对象当做锁,不过多个同步代码块里面的代码如果想同步执行的话必须要用一把锁,即同一个引用.如 final Integer lock = 1; synchronized(lock) {xxxxxxx}

非静态的同步方法只需要在方法声明上加 synchronized关键字即可,锁对象是this,静态的方法因为直接可以用类名.方法名调用,所以锁对象是当前类的字节码对象,即XXX.class

非线程安全的Collection或者Map子类对象如ArrayList等可以调用Collections.synchronizedXXX方法来获取支持同步的集合.

Runtime是一个运行时类,是一个单例类,可以用 Runtime.getRuntime()获取运行时对象,可以用exec()方法执行在cmd里面的命令.

Timer类是一个定时器,构造方法里面可以传入一个TimerTask子类对象,重写run()方法,用schedule()方法传入第一个参数TimerTask和第二个参数Date,到时间就会执行run()方法.schedule()方法还有第三个可选参数,就是循环执行,如传入3000,那么就会每隔3秒执行一次.

Object.notify() 随机唤醒单个等待线程, Object.notifyAll() 唤醒所有等待线程,Object.wait()让当前线程等待,可以传入时间参数.在同步代码块中,sleep是不释放锁的,而wait会释放锁.

ReentranLock是1.5版本的互斥锁,可以替换掉synchronized同步代码块使用,用ReentranLock.lock()加锁,unlock()解锁. ReentranLock.newCondition()是创建一个当前互斥锁的监视器,condition1.await()是让当前线程等待.condition1.signal()是唤醒condition1所在的线程.

ThreadGroup是线程组,默认创建的线程属于main线程组. new Thread(1, 2, 3) 1指定线程的组,2指定一个实现了Runnable接口的对象,3是线程的名字.

线程的五种状态: 1.新建: 创建线程对象, 2.就绪:已经启动,但是没有获取到CPU执行权, 3.运行:获取到了CPU,正在运行, 4.阻塞: 没有CPU的执行权,回到就绪, 5.死亡: 运行完毕,线程消亡.

ExecutorService 是线程池,可以用 Executors.newFixedThreadPool(2)来创建一个固定线程个数的线程池,用ExecutorService.submit()提交一个实现了Runnable接口的对象.用ExecutorService.shutdown()关闭线程池,不接受新的线程提交.

可以用Callable实现多线程,首先实现Callable<>接口,泛型是返回值的类型,重写call方法,然后把这个类的实例放到线程池中执行,用Future类接收返回对象,get方法获取返回值.

原文地址:https://www.cnblogs.com/cccy0/p/9785451.html

时间: 2024-08-30 11:30:05

Java : java基础(4) 线程的相关文章

Java并发基础(六) - 线程池

Java并发基础(六) - 线程池 1. 概述 这里讲一下Java并发编程的线程池的原理及其实现 2. 线程池的基本用法 2.1 线程池的处理流程图 该图来自<Java并发编程的艺术>: 从图中我们可以看出当一个新任务到线程池时,线程池的处理流程如下: 线程池首先判断线程池里面线程数是否达到核心线程数.如果不是则直接创建新线程作为核心线程来执行该任务(该线程作为核心线程不会由于任务的完成而销毁),否则进入下一流程. 判断阻塞队列是否已经满了.如果没满则将该任务放入阻塞队列中,等待核心线程处理,

Java语言基础-多线程-①线程的创建和启动

简单阐释进程和线程 对于进程最直观的感受应该就是“windows任务管理器”中的进程管理: (计算机原理课上的记忆已经快要模糊了,简单理解一下):一个进程就是一个“执行中的程序”,是程序在计算机上的一次运行活动.程序要运行,系统就在内存中为该程序分配一块独立的内存空间,载入程序代码和资源进行执行.程序运行期间该内存空间不能被其他进程直接访问.系统以进程为基本单位进行系统资源的调度和分配.何为线程?线程是进程内一次具体的执行任务.程序的执行具体是通过线程来完成的,所以一个进程中至少有一个线程.回忆

Java多线程基础(四)Java传统线程同步通信技术

Java多线程基础(四)Java传统线程同步通信技术 编写代码实现以下功能 子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次. 分析 1)子线程循环10次与主线程循环100次必须是互斥的执行,不能出现交叉,下面代码中通过synchronized关键字实现此要求: 2)子线程与主线程必须交替出现,可以通过线程同步通信技术实现,下面代码中通过bShouldSub变量实现此要求: 其他需要注意的地方 1)其中business变量必须声

线程基础:线程(3)——JAVA中的基本线程操作(中)

(接上文<线程基础:线程(2)--JAVA中的基本线程操作(上)>) 1-4.注意synchronized关键字的使用 在前面的文章中我们主要讲解的是线程中"对象锁"的工作原理和操作方式.在讲解synchronized关键字的时候,我们还提到了synchronized关键字可以标注的位置.大家经常看到相当部分的网贴,在它们的代码示例中将synchronized关键字加载到代码的方法体上,然后告诉读者:这个操作是线程安全的.代码可能如下: /** * 这个类的class对象进

Java多线程编程基础之线程对象

在进入java平台的线程对象之前,基于基础篇(一)的一些问题,我先插入两个基本概念. [线程的并发与并行] 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent).而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel). 在上面包括以后的所有论述中,请各位朋友谅解,我无法用最准确的词语来定义储

(CZ深入浅出Java基础)线程笔记

一.线程的引入 1.多线程概述 1.1.进程 a.正在运行的程序,是系统进行资源分类和调用的独立单位. b.每个进程都有它自己的内存空间和系统资源. 1.2.线程 a.是进程中的单个顺序控制流,是一条执行路径. b.一个进程如果只有一条路径,则称为单线程程序. c.一个进程如果有多条执行路径,则称为多线程程序. 1.3.小结 线程多的进程抢到CPU执行权的概率大,但是仍具有随机性. 2.Java程序运行原理 2.1.Java运行 Java命令会启动Java虚拟机,启动JVM,等于启动了一个应用程

Java多线程基础:进程和线程之由来

在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累.由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助. 下面是本文的目录大纲: 一.操作系统中为什么会出现进程? 二.为什么会出现线程? 三.多线程并发 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文地址:

黑马程序员--Java基础--多线程|线程同步

--Java培训.Android培训.iOS培训..Net培训 期待与您共同交流!-- 多线程基础.线程同步 1. 多线程基础 1.1. 进程和线程 1.1.1. 什么是进程 所谓进程(process)就是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元.进程中所包含的一个或多个执行单元称为线程(thread).进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问.线程只能归属于一个进程并且它只能访问该进程所拥有的资源.当操作系统创建一个进程后,该进程会自动

【java基础】线程池

为什么要使用线程池 线程池用于多线程处理中,它可以根据系统的情况,可以有效控制线程执行的数量,优化运行效果.线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,那么超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行. 线程池的特点 线程复用 控制最大并发数量 管理线程 线程池的优点 降低资源消耗,通过重复利用已创建的线程来降低线程创建和销毁造成的消耗. 提高相应速度,当任务到达时,任务可以不需要的等到线程

Java基础之线程

进程与线程 进程:进程是指内存中运行得一个程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程:进程是程序运行的一次过程,是系统运行程序的基本单位. 线程:进程内部以个单独的独立执行单元,一个进程可以包含多个线程. 进程与线程的区别: 进程:有独立的存储空间,进程中的数据存放空间(栈空间和堆空间)是独立的,至少有一个线程 线程:堆空间是共享的,栈空间是独立的,线程消耗的资源比进程小得多 线程掉度 计算机CPU在任意时刻只能执行一条指令,每一个进程只有获得CPU的使用权才能去执行