Java-多线程基本
Java-多线程基本
一 相关的概念
进程:是一个正在执行中的程序
每个进程都有一个执行的顺序,该顺序是一个执行路径,或者叫一个控制单元
线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行
注意 :
一个进程至少有一个线程
Java VM启动的时候会有一个进程java.exe
该进程中至少一个线程负责java程序的执行,并且这个线程执行的代码在main方法中
该线程称为主线程
JVM启动不止一个线程,还有负责垃圾回收机制的线程
二 自己定义创建线程
须要用到Thread类
创建方法一:
1.定义类继承自Thread
2.复写Thread中的run方法
3.调用线程的start方法,该方法有两个作用:启动线程。调用run方法
创建方法二:
1.定义类实现Runnable接口
2.覆盖Runnable接口中的run方法
3.通过Thread类建立线程对象
4.将Runnable接口的子类对象作为实际參数传递给Thread类的构造函数:
原因是自己定义的run方法所属的对象是Runnable接口的子类对象
所以要让线程去指定对象的run方法。就必须明白run方法的所属对象
5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法
两种方式的差别:
方法二实现方式的优点:避免了单继承的局限性,建议使用实现的方式
多线程的特性:随机性。因为cpu的分时调度规则(在某一个时刻,cpu只执行一个程序,cpu在执行过程中做着高速的切换),至于执行的时间,cpu说的算
对象调用run和start的差别:
start:开启线程并执行该线程的run方法
run:不过对象调用方法,并且线程创建了,并没有执行
多线程的执行状态:
创建,执行,消亡,堵塞。冻结
例如以下图:
多线程经常使用的方法:
static Thread currentThread()获取当前线程对象
getName()获取线程名称。线程名称默认格式为Thread-0(1,2,3…..)
setName或者构造函数能够设置线程名称
三 多线程的安全问题:
解决线程操作数据时的时间差问题须要用到
1。同步代码块
synchronized(对象锁)
{
须要同步的代码。
}
2,同步函数
就是将synchronized关键字加到函数上
public synchronized void Test()
{
}
怎样找出线程的安全隐患:
1.明白哪些代码是多线程执行代码
2.明白共享的数据
3.明白多线程执行代码中哪些语句是操作共享数据的
三 锁
锁:
锁就是一个对象
同步函数的锁死this,
静态同步函数的锁是该方法所在类的字节码文件对象。类名.class对象:静态方法中不能够定义this,静态方法进入内存,内存中还没有本类的对象
可是一定有该类相应的字节码文件对象,类名.class。该对象的类型是class
死锁:两个线程相互争夺锁的情况
以下是一个面试题:写一个死锁的Demo
class Test implements Runnable
{
private boolean flag;
Test(boolean p_flag)
{
this.flag = p_flag;
}
public void run()
{
if (flag)
{
while (true)
{
synchronized(MyLock.locka)
{
System.out.println("if locka");
synchronized(MyLock.lockb)
{
System.out.println("if lockb");
}
}
}
}
else
{
while (true)
{
synchronized(MyLock.lockb)
{
System.out.println("if lockb");
synchronized(MyLock.locka)
{
System.out.println("if locka");
}
}
}
}
}
}
//锁对象
class MyLock
{
static Object locka = new Object();
static Object lockb = new Object();
}
class TestDemo
{
public static void main(String[] args)
{
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));
t1.start();
t2.start();
}
}
四 多线程与单例设计模式:
主要是懒汉式的问题:
class Singel
{
private static Singel s = null;
private Singel();
public static Singel getInstance()
{
//双重推断能够解决效率低的问题
if (null == s)
{
//synchronized关键字比起在函数上同步更加高效
synchronized(Singel.class)//使用的本类文件的锁
{
if (null == s)
{
s = new Singel();
}
}
return s;
}
}
}
上面的代码须要记住。面试可能会问到
Java-多线程基本的更多相关文章
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
- Java多线程系列--“JUC锁”03之 公平锁(一)
概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
- Java多线程--让主线程等待子线程执行完毕
使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...
- Java多线程 2 线程的生命周期和状态控制
一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...
- java 多线程 1 线程 进程
Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报 分类: javaSE综合知识点(14) 版权声明:本文为博主原创文章,未经博 ...
- 一起阅读《Java多线程编程核心技术》
目录 第一章 Java多线程技能 (待续...)
- 第一章 Java多线程技能
1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...
- java从基础知识(十)java多线程(下)
首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...
随机推荐
- C语言 · 排列数
算法提高 排列数 时间限制:1.0s 内存限制:256.0MB 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入 ...
- RP2836 OUT0-OUT7 对应关系
ARM-IO9 OUT0 PA8 备用 P5-A4管脚,可以连接74HC164D级联 ARM-IO10 OUT7 PA1 3 ...
- web.xml文件中<mime-mapping>
http://blog.csdn.net/sccemstanford/article/details/9064155 ————————————————————————————————————————— ...
- JavaScript语言精粹读书笔记- JavaScript对象
JavaScript 对象 除了数字.字符串.布尔值.null.undefined(都不可变)这5种简单类型,其他都是对象. JavaScript中的对象是可变的键控集合(keyed collecti ...
- php模拟动态输出效果
读取数据库,显示数据 foreach($s as $ss){ echo '同步中 ...<br />'; for( $i = 1 ; $i < 2 ; $i++ ) { //echo ...
- PyCharm中设置console端的字体和大小
file--->setting,选择console Font,右侧primary font即设置console端的字体和大小
- EF报LINQ to Entities 不识别方法“Web_JZRepository.Models.copy_materials_details get_Item(Int32) ”,因此该方法无法转换为存储表达式。
说明用了如 List<T> list=new List<T>(); je.copy_materials_details.SingleOrDefault(x => x.ID ...
- Apache版Phoenix的安装(图文详解)
不多说,直接上干货! 写在前面的话 我这里,三个节点的bigdata集群.分别为master.slave1和slave2. 1.Phoenix的下载 我的HBase版本是hbase-0.98.19. ...
- Oracle 10g 数据库手动创建步骤
Oracle 数据库手动创建步骤 编写初始化参数文件 设置操作系统环境变量 创建实例 以管理员身份连接数据库 启动实例 create database 创建数据库 运行数据字典脚本 Oracle的网络 ...
- 【javaScript基础】马上调用函数表达式
在javaScript中,每一个函数被调用时,都会创建一个新的运行上下文.由于在一个函数里面定义的变量和函数仅仅能在里面訪问.在外面是不行的.上下文提供了一种非常easy的方法来创建私有性. //ma ...