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方法获取返回值.
Java : java基础(4) 线程的更多相关文章
- Java并发基础:线程的创建
线程的创建和管理: 1.应用Thread类显式创建.管理线程 2.应用Executor创建并管理线程. 定义任务: 无返回的任务:实现Runnable接口并编写run()方法. 有响应的任务:实现Ca ...
- Java并发基础06. 线程范围内共享数据
假设现在有个公共的变量 data,有不同的线程都可以去操作它,如果在不同的线程对 data 操作完成后再去取这个 data,那么肯定会出现线程间的数据混乱问题,因为 A 线程在取 data 数据前可能 ...
- Java并发基础04. 线程技术之死锁问题
我们知道,使用 synchronized 关键字可以有效的解决线程同步问题,但是如果不恰当的使用 synchronized 关键字的话也会出问题,即我们所说的死锁.死锁是这样一种情形:多个线程同时被阻 ...
- Java并发基础概念
Java并发基础概念 线程和进程 线程和进程都能实现并发,在java编程领域,线程是实现并发的主要方式 每个进程都有独立的运行环境,内存空间.进程的通信需要通过,pipline或者socket 线程共 ...
- Java多线程基础知识总结
2016-07-18 15:40:51 Java 多线程基础 1. 线程和进程 1.1 进程的概念 进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程, ...
- Java多线程基础:进程和线程之由来
转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...
- Java并发基础:进程和线程之由来
转载自:http://www.cnblogs.com/dolphin0520/p/3910667.html 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程. ...
- java并发基础(五)--- 线程池的使用
第8章介绍的是线程池的使用,直接进入正题. 一.线程饥饿死锁和饱和策略 1.线程饥饿死锁 在线程池中,如果任务依赖其他任务,那么可能产生死锁.举个极端的例子,在单线程的Executor中,如果一个任务 ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- 1、Java多线程基础:进程和线程之由来
Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
随机推荐
- 开通cnblogs博客
开通博客,准备记录学习和开发过程
- 简谈 Java 中的泛型通配符
很好的一篇文章https://zhuanlan.zhihu.com/p/26681625
- Matlab函数——awgn(高斯噪声)
Matlab函数--awgn awgn 将白色高斯噪声添加到信号中 语法 y = awgn(x,snr) y = awgn(x,snr,sigpower) y = awgn(x,snr,'mea ...
- WebLogic配置与部署
一.创建域: 第一步,选择“开始菜单”-> “Oracle WebLogic”-> “WebLogic Server 10gR3” -> “Tools”-> “Configur ...
- elenium2学习(十六)-- 富文本(自动发帖)
前言 富文本编辑框是做web自动化最常见的场景,有很多小伙伴遇到了不知道无从下手,本篇以博客园的编辑器为例,解决如何定位富文本,输入文本内容 一.加载配置 1.打开博客园写随笔,首先需要登录,这里为了 ...
- libxml
/** * section: Tree * synopsis: Navigates a tree to print element names * purpose: Parse a file to a ...
- react中性能优化的点
react提升代码性能的点 1.绑定如果改变作用域点话放在constructor里面做,这样可以保证整个程序的作用域绑定操作只会执行一次,而且避免子组件的无谓渲染. 2.内置的setState是个异步 ...
- hibermate一对一关联
在hibernate.cfg.xml配置<mapping class="oneToOne.IDCard" />,以及实体类的get和set方法省略了. User类 @E ...
- Maven 搭建spring boot多模块项目
Maven 搭建spring boot多模块项目 备注:所有项目都在idea中创建 1.idea创建maven项目 1-1: 删除src,target目录,只保留pom.xml 1-2: 根目录pom ...
- 【luogu P3275 [SCOI2011]糖果】 题解
题目链接:https://www.luogu.org/problemnew/show/P3275 把不等式 A > B 转化成 A - B >= 1或者 B - A <= -1再差分 ...