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并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通 ...
随机推荐
- Java性能调优实践
1 导论 JVM主要有两类调优标志:布尔标志和附带参数标志 布尔标志:-XX:+FlagName表示开启,-XX:-FlagName表示关闭. 附带参数标志:-XX:FlagName=somethi ...
- 面向切面编程-AOP的介绍
AOP简介 AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象 ...
- 模拟ArrayList
package com.helloidea; import java.util.ArrayList; import java.util.Collection; import java.util.Lis ...
- mysqldump备份脚本一例
参考三思老师书中所写,感觉挺好用,记录下来,虽然是抄袭,但是手抄还是很累的,其中用到的其他脚本,在博客中已经记录: mysql_full_backup.sh#!/bin/sh#Created by C ...
- May 31st 2017 Week 22nd Wednesday
No great discovery was ever made without a bold guess. 没有大胆的猜测就没有伟大的发现. When our ancestors saw the b ...
- mysql的安装和使用
1.下载 数据库:mysql-3.23.53-win1 可视化工具:mysqlcc-0.9.4-win32 2.步骤: (1)解压mysql-3.23.53-win1(其他的也可以),按照步骤安装到你 ...
- BZOJ2976:[POI2002]出圈游戏(exCRT)
Description 有编号从1到n的n个小朋友在玩一种出圈的游戏,编号为i+1的小朋友站在编号为i小朋友左边.编号为1的小朋友站在编号为n的小朋友左边.首先编号为1的小朋友开始报数,接着站在左边的 ...
- Wannafly模拟赛
题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两个整数n, m代表矩阵的长和宽: 接下来n行,每 ...
- 使用Vue做评论+localStorage存储(js模块化)
未分模块化 html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...
- 大专生自学web前端前前后后
先做个自我介绍,我13年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了.13年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学 ...