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-多线程基本的更多相关文章

  1. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  2. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  3. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  4. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  5. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  6. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  7. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  8. 一起阅读《Java多线程编程核心技术》

    目录 第一章 Java多线程技能 (待续...)

  9. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  10. java从基础知识(十)java多线程(下)

    首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...

随机推荐

  1. 卖座网一处SQL注射(Http Referer sqlinjection)

    漏洞作者: 猪猪侠 漏洞详情 披露状态: 2015-01-13: 细节已通知厂商并且等待厂商处理中2015-01-14: 厂商已经确认,细节仅向厂商公开2015-01-24: 细节向核心白帽子及相关领 ...

  2. 【基础练习】【区间DP】codevs2102 石子归并2(环形)题解

    题目描写叙述 Description 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次仅仅能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个 ...

  3. hashSet的底层是数组,其查询效率非常高

    如果偷懒,没有设定equals(),就会造成返回hashCode虽然结果相同,但在程序执行的过程中会多次地调用equals(),从而影响程序执行的效率. 我们要保证相同对象的返回的hashCode一定 ...

  4. 纪念,BZOJ AC 100题!

    虽然说有将近50+是usaco,然后还有很多水题T_T 看来我还是刷水题.... 看来我还是那么弱. T_T 但是好歹也要留个纪念..

  5. android DialogFragment 回调到 Fragment

    google 从3.0開始就引入了 Fragment 概念,用 Fragment 取代多 Activity,假设你还停留在 Activity 时代,那你就面壁去吧! Fragment 是好用,可是又几 ...

  6. E-R图到数据库表

    数据库E-R图相关 日 17:39 E-R数据模型所採用的三个主要概念是:实体集.联系集和属性 实体集:具有同样类型及同样性质(或属性)的实体集合 属性:简单属性和符合属性:单值属性和多值属性:nul ...

  7. hdu 1358:Period(KMP算法,next[]数组的使用)

    Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  8. DBA面试题及解答

    一:SQL tuning 类 1:列举几种表连接方式答:merge join,hash join,nested loop Hash join散列连接是CBO 做大数据集连接时的常用方式,优化器使用两个 ...

  9. Codeforces Round #296 (Div. 2) B. Error Correct System

    B. Error Correct System time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  10. 如何正确设置 Informix GLS 及 CSDK 语言环境

    本文介绍 GLS 相关知识,说明如何正确设置 Informix GLS 语言环境相关变量(DB_LOCALE,CLIENT_LOCALE),保证 Informix 数据库服务器.客户端能正确的支持中文 ...