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. phoenix 入门

    http://phoenix.apache.org/Phoenix-in-15-minutes-or-less.html Blah, blah, blah - I just want to get s ...

  2. 轻量级分布式 RPC 框架(转)

    RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Servi ...

  3. 点击edittext并显示其内容

    package com.example.sum;//sum import com.example.sum.R;//sum import android.app.Activity; import and ...

  4. IIS状态码大全【转】

    对于站长来说,经常分析下网站的IIS日志是有好处的,这样可以随时了解SE蜘蛛是否经常光顾自己的网站,都抓取了哪些页面,被抓取的页面哪些是被正常的,哪些是不正常的.而IIS日志有专门的返回状态码,为了方 ...

  5. POST GET 请求示例

    HTTP GET 请求代码: HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.baidu.com ...

  6. HMLocationEvent

    HMLocationEvent *locEvent = [[HMLocationEvent alloc] initWithRegion:region1]; region1.notifyOnEntry ...

  7. Amazon(vpc)对等网络

    对等连接测试 1.1 东京账户A创建对等连接 注意,双方的vpc网段不能重复,如果重复会造成无法配置路由表 输入双方信息 账户ID和VPC 1.2 东京账户A查看 查看连接信息 显示正在处理接受,需要 ...

  8. word excel文件 存入数据库 实战

    上传: private void Insert2017(HttpContext context) { if (context.Request.Files["fileword"].C ...

  9. Python Scrapy 自动爬虫注意细节(3)

    一.对指定页面爬取 yield Request(url, meta={'cookiejar': response.meta['cookiejar']}, callback=self.parse_url ...

  10. linux命令之rpm

    1.查询一个包是否被安装的命令rpm -q  < rpm package name> 2.列出所有被安装的rpm package 命令rpm -qa