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多线程(下)
首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...
随机推荐
- sort-uniq-cut-join命令练习
[root@linux Desktop]# cat> fruits.txt banana orange persimmon %%banana apple ORAGE cat> fruits ...
- Android基础总结(八)Service
服务两种启动方式(掌握) startService 开始服务,会使进程变成为服务进程 启动服务的activity和服务不再有一毛钱关系 bindService 绑定服务不会使进程变成服务进程 绑定服务 ...
- postgreSQL php及客户端
yum install php-pgsql “conf/config.inc.php”) $conf['servers'][0]['host'] = 'localhost'; and $conf['e ...
- koa介绍
https://github.com/koajs/koa https://github.com/demopark/koa-docs-Zh-CN ctx.response.type = 'json'; ...
- kettle两表内链接的查询结果与sql语句的查询结果不符合?
1.教师表输入 2.学生表 查 3.学生表中查出的教师id进行排序 5.教师表中查出的同样也对教师的id进行排序 6.进行左连接 总结: 进行连接的时候的关键是同样对教师的id进行先排序
- Scala + Play + Sbt + Protractor = One Build
欢迎关注我的新博客地址:http://cuipengfei.me/ 我所在的项目的技术栈选用的是Play framework做后端API,前端用Angular JS. 因为用了Scala和Play,构 ...
- 你真的需要一个jQuery插件吗
jQuery的插件提供了一个很好的方法,节省了时间和简化了开发,避免程序员从头开始编写每个组件.但是,插件也将一个不稳定因素引入代码中.一个好的插件节省了无数的开发时间,一个质量不好的插件会导致修复错 ...
- Sublime 插件补充
开启vim模式+autosave+Livereload插件 安装参考:emmmet http://www.cnblogs.com/wuheng1991/p/6144955.html
- LoadRunner中winsocket协议学习
首先让我们先看一下loadrunner- winsock 函数 一览表: lrs_accept_connection 接受侦听套接字连接 lrs_close_socket 关闭打开的套接 ...
- jQuery功能函数详解
jQuery通过$.browser对象获取浏览器信息. 属性 说明msie 如果是ie为true,否则为falsemozilla 如果是mozilla相关的浏览器为true,否则为falsesafar ...