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 内存限制:512.0MB 问题描述 Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0 ...
- git clone 故障 fatal could not create work tree dir
问题如上图,原因是openWRT目录权限的问题,该目录是新创建的查看目录权限后发现该目录只对root有读写权限,对所有者及其他用户无读写权限.最简单的chmod 777 openWRT即可解决问题.
- MyBatis 本是apache的一个开源项目iBatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .20 ...
- 察看下列JSP内容
察看下列JSP内容 <html><body> <% for (int i=0;i<3;i++){ %> out.print(i*2); <% } %&g ...
- print多重打印
遇见有趣的问题必须记录下来,当时的想法思路也要记下来 以下两行代码打印出来的结果会是什么 print('2 * 3 = %d' % (2 * 3)) print('2 * 3 = %d' % 2 * ...
- 编程之美 set 4 找到符合条件的数
题目 任意给定一个正整数 N, 求一个最小的正整数 M (M > 1), 使得 N*M 的十进制表达式中只有 0 和 1. 解法 1. 枚举0,1能够组成的数字, 可以组成一颗二叉树 然后由 B ...
- Linux命令之乐--find
find是命令行工具箱中最棒的命令之一. 列出当前目录及其子目录中的文件和文件夹. [root@LAMP WebRoot]# find . -print../index.jsp./upload.jsp ...
- sql 提升查询效率 group by option hash group
问题: 一个程序查询经常超过20siis限制时间,排查问题后发现其中的一个存储过程时间会在15s左右 解决思路: 1:确认问题点 通过输出时间的方式查看存储过程中每个部分的执行时间,找到最耗时的三个过 ...
- 【BZOJ1935/4822】[Shoi2007]Tree 园丁的烦恼/[Cqoi2017]老C的任务 树状数组
题意:两道题差不多,都是给你一堆平面上的点,每个点有权值,然后m次询问求某一矩形区域内的点权和 题解:先离散化,然后将询问拆成左右两条线段,然后将点和这些线段一起按x坐标排序,在y轴上维护树状数组.然 ...
- LAMP集群项目五 nfs存储的数据实时同步到backupserver
tar fxzsersync2.5.4_64bit_binary_stable_final.tar.gz -C /usr/local/ mv GNU-Linux-x86 sersync cp sers ...