Java多线程-Java多线程概述
第一章 Java多线程概述
线程的启动
线程的暂停
线程的优先级
线程安全相关问题
1.1 进程与线程
进程:可以将运行在内存中的程序(如exe文件)理解为进程,进程是受操作系统管理的基本的运行单元。
线程:可以理解为进程中独立运行的子任务。如果QQ.exe运行时的好友视频线程、下载文件线程、数据传输线程、发送消息线程等。
使用多线程可以更好的利用计算机的资源如CPU。线程被调用的时机是随机的。
1.2 Java多线程实现方式
1.2.1 继承Thread类
public class Thread implement Runnable
Thread 类实现了Runnable接口,它们之间具有多态关系。重新run方法,方法内编写执行任务的代码。启动线程后会调用run方法。当run方法执行结束后,线程也会跟着终止。
我们需要在主程序中使用Thread类的start方法启动新的线程。
public class MyThread extends Thread{ @override public void run(){ System.out.println("新的线程!"); } } public class Main{ public static void main(String[] args){ MyThread t = new MyThread(); t.start(); System.out.println("主线程!"); } }
注:多次调用start方法会出现IllegalThreadStateException异常。
1.2.2 实现Runnable接口
继承Thread实现多线程有设计上的局限性,如果欲创建的线程类已经有一个父类,这是不能再继承Thread类了,java不支持多继承,所以可以实现Runnable接口。
public class MyRunnable implements Runnable { @override public void run(){ System.out.println("运行中"); } }
Thread类有两个构造器函数Thread(Runnable target)和Thread(Runnable target, String name)可以接收Runnable接口。
public class Main{ public static void main(String[] args){ Runnable r = new MyRunnable(); Thread t = new Thread(r); t.start(); System.out.println("主线程!"); } }
1.2.3 ThreadFactory启动线程
java.util.concurrent中包含一个将线程创建抽象化的ThreadFactory接口。利用该接口,可以将Runnable作为参数并通过new创建Thread实例的处理隐藏在ThreadFactory内部。默认的ThreadFactory对象是通过Executor.defaultThreadFactoy方法获取的。
public class Main{ public static void main(String[] args){ ThreadFactory factory = Executor.defaultThreadFactoy; Runnable r = new MyRunnable(); factory.newThread(MyRunnable).start(); } }
1.3 线程安全与锁
在共享数据的情况下即多个线程访问同一变量,可能存在线程安全问题。
通过在run方法前加入synchronized关键字,使得多个线程在执行run方法时排队进行处理。
synchronized可以在任意对象及方法上加上锁,加锁的到吗称为“互斥区”或“临界区”。
public class MyThread extends Thread{ private int count = 5; @override synchronized public void run(){ count--; } }
synchronized方法和synchronized代码块
synchronized void method(){ ... } void method(){ synchronized(this){ ... } }
死锁:两个线程分别持有锁,并互相等待对方释放锁。
发生死锁的条件:
(1)存在多个sharedResource角色;
(2)线程持有某个SharedRosource角色锁的同时,还想获取其他SharedResource角色的锁;
(3)获取SharedResource角色的锁的顺序并不固定
1.4 停止线程
停止一个线程意味着在线程处理完任务之前停掉正在做的操作。虽然看起来非常简单,但是必须做好防范,以便达到预期的效果。停止一个线程可以使用Thread.stop()方法,但是最好不用它,已经被java高版本放弃。
大多数停止一个线程的操作使用Thread.interrupt()方法。
Java中三种停止正在运行线程的方法:
设置退出标志变量,也就是当run方法完成后线程终止;
使用stop方法,但不推荐;
使用interrupt方法中断线程。
interrupt方法仅仅是在当前线程中打了一个停止标记,并不是真的停止线程。
this.interrupted():测试当前线程是否已经中断,执行后具有将状态标志清除为false的功能;
this.isInterrupted():线程线程Thread对象是否已经中断状态,但不清楚状态标志。
如果在sleep状态下停止一个线程,会进入catch语句,并且清楚停止状态值,使之变成false。
如果使用stop强制让线程停止则有可能使一些请理性的工作得不到完成。另外就是对锁定对象进行了解锁,导致数据得不到同步处理,出现数据不一致问题。
1.5 暂停线程
暂停线程意味着线程还可以恢复运行。java中使用suspend方法暂停线程,使用resume方法恢复线性。
使用suspend和resume方法如果使用不当,极易造成公共的同步对象的独占,使得其他线程无法访问公共同步对象。
同时也容易出现数据不同步情况。
1.5 Thread相关方法
Thread.currentThread()方法可以返回当前线程信息,如Thread.currentThread().getName();
getId():获取线程唯一标识
sleep(long millis):将正在执行的线程休眠。
sleep方法使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。
yield():方法的作用是放弃当前CPU资源,将它让给其他的任务去占用CPU执行时间。
一个调用yield()方法的线程告诉虚拟机它乐意让其他线程占用自己的位置。这表明该线程没有在做一些紧急的事情。注意,这仅是一个暗示,并不能保证不会产生任何影响。并且yield方法只能让同优先级的线程有执行的机会。
wait()和notify()、notifyAll() :都是java.lang.Object的方法
这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用。synchronized关键字用于保护共享数据,阻止其他线程对共享数据的存取,但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。
wait()方法使当前线程暂停执行并释放对象锁标示,让其他线程可以进入synchronized数据块,当前线程被放入对象等待池中。当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。
notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。
1.6 线程优先级
在操作系统中,线程可以划分优先级,优先级较高的线程的到CPU资源较多。
优先级的继承特性:如果A线程启动B线性,则AB优先级一样。
使用setPriority()可以设置优先级:java提供了三个变量MIN_PRIORITY、MAX_PRIORITY和NORM_PRIORITY
优先级较高的线程不一定每次都先执行完。
1.7 守护线程
java线程中有两种线程,一种是用户线程,另一种是守护线程。
当进程中不存在非守护线程了,则守护线程自动销毁。典型的守护线性就是垃圾回收线程。
Java多线程-Java多线程概述的更多相关文章
- Java多线程| 01 | 线程概述
Java多线程| 01 | 线程概述 线程相关概念 进程与线程 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位.可以把进程简单的理解 ...
- Java多线程——<八>多线程其他概念
一.概述 到第八节,就把多线程基本的概念都说完了.把前面的所有文章加连接在此: Java多线程——<一>概述.定义任务 Java多线程——<二>将任务交给线程,线程声明及启动 ...
- 黑马程序员 Java基础<九>---> 多线程
ASP.Net+Android+IOS开发..Net培训.期待与您交流! 多线程 一.概述: 1.线程是什么 说到线程,我们就得先说说进程.所谓进程,就是一个正在执行(进行)中的程序,每一个进程执行都 ...
- Java基础总结--多线程总结2
----多线程通信-----1.概述:多个线程处理同一个资源,但是各自的任务不相同eg:线程1负责存储数据,线程2负责处理该数据.数据--就是同一个资源怎样用java语言描述上面的例子:* 资源是变化 ...
- java高级之多线程
1.1,多线程的作用: *线程是程序执行的一条路径, 一个进程中可以包含多条线程 *多线程并发执行可以提高程序的效率, 可以同时完成多项工作 1.2,多线程的应用场景: * 红蜘蛛同时共享屏幕给多个电 ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- Java线程与多线程教程
本文由 ImportNew - liken 翻译自 Journaldev. Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用 ...
- 黑马程序员——JAVA基础之多线程的线程间通讯等
------- android培训.java培训.期待与您交流! ---------- 线程间通讯: 其实就是多个线程在操作同一个资源,但是动作不同. wait(); 在其他线程调用此对象的notif ...
- 【Java】Socket+多线程实现控制台聊天室
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827212.html 聊天室程序的结构图: 架构解释: Server服务器相当于一个中转站,Client客户端 ...
随机推荐
- POJ 1966 Cable TV Network 【经典最小割问题】
Description n个点的无向图,问最少删掉几个点,使得图不连通 n<=50 m也许可以到完全图? Solution 最少,割点,不连通,可以想到最小割. 发现,图不连通,必然存在两个点不 ...
- Python完成RF测试用例
Robot Framework 框架是基于 Python 语言开发的,所以,它本质上是 Python 的一个库. from robot.api import TestSuite from robot. ...
- laravel 命令行输出进度条
有时候我们想在命令行执行一些耗时的命令,我们可以利用 symfony 提供的进度条相关的类,来输出一个进度条,显示当前的处理进度. 参考:http://symfony.com/doc/current/ ...
- rsync命令的基本使用
rsync命令的基本使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. rsync服务软件是一款开源,高速的,数据同步(拷贝)工具. 一.rsync服务的特点 1>.本地拷贝 ...
- Java基础-数组常见排序方式
Java基础-数组常见排序方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 数据的排序一般都是生序排序,即元素从小到大排列.常见的有两种排序方式:选择排序和冒泡排序.选择排序的特 ...
- oracle进阶之分析函数
本博客是自己在学习和工作途中的积累与总结,纯属经验之谈,仅供自己参考,也欢迎大家转载,转载时请注明出处. http://www.cnblogs.com/king-xg/p/6797119.html 分 ...
- Ubuntu如何同步网络时间
解决方法: 1.安装ntpdate工具 apt-get install ntpdate 2.将系统时间与网络同步 ntpdate cn.pool.ntp.org 3.将时间写入硬件 hwclock - ...
- Shell记录-Shell脚本基础(五)
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...
- mongodb 跟踪SQL语句及慢查询收集
有个需求:跟踪mongodb的SQL语句及慢查询收集 第一步:通过mongodb自带函数可以查看在一段时间内DML语句的运行次数. 在bin目录下面运行 ./mongostat -port 端口号 ...
- C#_连接数据库实现 登录注册界面
//编写登录界面逻辑 using System; using System.Collections.Generic; using System.ComponentModel; using System ...