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并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
随机推荐
- sql server中将自增长列归零
一个项目完成后数据库中会有很多无用的测试数据,可以使用delete * 将数据全部删除,但自增长列(一般是主键)基数不会归零,使用TRUNCATE函数可以将表中数据全部删除,并且将自增长列基数归零.一 ...
- MVG配置
MVG的配置:(前提是一个表的字段包含多值字段,一般是1:M或M:M的关系) 想要在学生界面显示多个教师的名称. 1.首先在一个Project中,建两张表学生表和教师表T_Stu与T_Tea和一张中间 ...
- SQL Server ->> Transparent Data Encryption(透明化数据加密)
Comming later... 参考文献: Transparent Data Encryption (TDE)
- SQL Server ->> 在SQL Server中创建ASSEMBLY
首先要把数据库的TRUSTWORTHY属性改为ON ALTER DATABASE [MYDB] SET TRUSTWORTHY ON GO 接下来直接创建ASSEMBLY应该就没问题了.但是往往有可能 ...
- (三)svn 服务器端之创建仓库
创建仓库 svn服务端创建完成需要创建仓库,仓库中存放 要被管理的文件. 通过开始菜单进入 VisualSVN server manager: 主界面为: 右键点击Repositories创建仓库 ...
- Win7 自带FTP将文件复制到FTP服务器时发生错误。
错误截图: 错误信息: 将文件复制到FTP服务器时发生错误.请检查是否有权限将文件放到该服务器上. 详细信息: 200 Type set to I. 200 PORT commad successfu ...
- 再学UML-深入浅出UML类图(三)
类与类之间的关系(2) 2. 依赖关系 依赖(Dependency)关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系. ...
- p2psearcher绿色版使用方法
P2pSearcher大家应该很了解,p2p是一款基于P2P技术的资源搜索软件,基于先进的P2P搜索技术,可在瞬间搜遍全球ED2k网络资源,简单便捷的搜索到ED2K网络上共享的海量影音娱乐,学习资料等 ...
- python接口测试-项目实践(一) 测试需求与测试思路
测试需求: 第三方系统提供了3个接口,需要测试前端显示的字符串里的对应数据与接口数据是否一致. 测试分层: 开发人员的设计:每周从接口取一次数据,拼接完成后保存到数据库.再从数据库取数提供接口给前端开 ...
- nautilus命令
nautilus 是图形程式效果是以当前用户打开图形界面所以如果想以root打开图形界面使用时记得先切为root,sudo没有用的