多线程编程之线程基础

前言

此内容是阅读了书籍《JAVA多线程编程核心技术》后作为学习总结的文章,同时也梳理一下内容。建议大家有兴趣都可以阅读一下这本书,对于想了解更多的同学来说是一个很好的教材,同时建议大家多去思考和动手编写代码,融会贯通之后再去看一遍,会有更多的体会。就比如《JVM底层实现最佳实战》的书籍一样,我读了已经不下五遍了,但每次读都能有新的收获一样。希望对大家有帮助。

该篇文章是用于了解多线程的一些基本概念、JDK支持多线程编程的类和方法,接口等。

1.1 进程与线程概念

什么是进程:
进程是操作系统结构的基础,是一次程序的执行,是程序及其数据结构在处理机上顺序执行时所发生的活动;
是程序在数据集合上运行的过程,它是系统进行资源分配和调度的独立单位。比如说:操作系统中运行的exe就是一个进程。其实进程就是应用。

什么是线程:
线程可以理解为进程中独立运行的子任务。比如QQ.exe运行时,有好友视频线程,文件下载线程,传输数据线程,发送表情线程等等。

1.2 实现多线程编程

JDK开发包中,自带了对多线程技术的支持,可以方便进行多线程编程。
实现多线程编程有多种方式:继承Thread类,实现Runnable接口,Callable接口

1.2.1继承Thread类

在继承Thread类实现多线程编程之前,我们先来看看Thread类结构:
优先级:[1,10]
线程状态:新建、就绪、阻塞、运行、死亡
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}

态切换图:

1.2.2实现Runnable接口

    @FunctionalInterface
    public interface Runnable {
        public abstract void run();
    }

1.2.3实现Callable接口

    @FunctionalInterface
    public interface Callable<V> {
        V call() throws Exception;
    }

1.2.4Runnable与Callable区别

Runnable不可以抛出异常,Callable可以;
Runnable不可以返回结果,Callable可以,结合FutureTask可以拿到结果,但会把当前线程阻塞。

1.2.5实例变量与线程安全

A.不共享数据的情况,不存在这个数据线程安全问题。
B.共享数据的情况,会存在数据线程安全问题。
这个时候需要给run方法加上synchronized关键字,防止线程间操作出现数据错乱。

1.3 currentThread()方法

获取当前线程信息

1.4 isAlive()方法

判断当前的线程是否出于活动状态。

1.5 sleep()方法

指定毫秒数线程休眠

1.6 getId()方法

获取线程唯一标识。

1.7 停止线程

interrupt()方法停止线程,仅仅是当前线程中打一个停止的标志,并不是真的停止线程。
this.interrupted():测试当前线程是否已经中断。 类方法
this.isInterrupted():测试线程是否已经中断。实例方法

异常可以中断线程。
stop暴力停止,已经作废,因为可能导致一些清理性工作得不到完成。另外一个是对锁定的对象进行了解锁导致数据得不到同步处理出现数据不一致的问题。
interrupt()与return结合使用也能实现停止线程。

1.8 暂停线程

暂停线程意味着此线程可以恢复运行。可以使用suspend()方法停止线程,resume()方法恢复线程运行。
但是suspend和resume方法使用不当,容易造成公共的同步对象独占,使得其他线程无法访问公共同步对象,容易导致数据不同步。

1.9 yield方法

yield方法的作用是放弃当前的CPU资源,将让给其他任务去使用CPU。但放弃的时间不确定,有可能马上又获取了CPU的时间片。

1.10 线程的优先级

线程具有优先级具有继承性。
可以通过setPriority()方法可以设置线程优先级。具有规则性:优先级高的总是大部分优先执行完,但不代表高优先级的线程全部执行。
具备随机性:不一定能保障高优先级每次都优先执行。

1.11 线程分类

分为用户线程、守护线程。
守护线程是一种特殊线程,它的线程有陪伴的含义,当进程不存在非守护线程时,则守护线程自动销毁。
比如守护线程最典型的就是GC(垃圾回收器)

总结:
这里主要提到了是线程的基本知识,需要上面有些代码我没有贴出来,主要一个是太简单,另外一个原因是希望读者能够动起手来来自己尝试写代码检测。这样有助于对线程知识加深理解。打完手工,最后希望有兴趣的同学能够看看这本书:《JAVA多线程编程核心技术》、《JAVA并发编程》、《JAVA高级编程》。如果我上面有什么错误希望读者能够留言给我,我会第一时间修改,以防止误导读者。

原文地址:http://blog.51cto.com/4837471/2332024

时间: 2024-11-10 14:49:50

多线程编程之线程基础的相关文章

.NET面试题解析(07)-多线程编程与线程同步

系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等,本文只是从常见面试题的角度(也是开发过程中常用)去深入浅出线程相关的知识.如果想要系统的学习多线程,没有捷径的,也不要偷懒,还是去看专业书籍的比较好. 常见面试题目: 1. 描述线程与进程的区别? 2. 为什么GUI不支持跨线程访问控件?一般如何解决这个问题? 3. 简述后台线程和前台线程的区别? 4. 说说常

Android多线程编程之线程池学习篇(一)

Android多线程编程之线程池学习篇(一) 一.前言 Android应用开发中多线程编程应用比较广泛,而应用比较多的是ThreadPoolExecutor,AsyncTask,IntentService,HandlerThread,AsyncTaskLoader等,为了更详细的分析每一种实现方式,将单独成篇分析.后续篇章中可能涉及到线程池的知识,特此本篇分析为何使用线程池,如何使用线程池以及线程池的使用原理. 二.Thread Pool基础 进程代表一个运行中的程序,一个运行中的Android

C#多线程编程实例 线程与窗体交互

代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = new Thread[10]; public Form1() { InitializeComponent(); } //此委托允许异步的调用为Listbox添加Item delegate void AddItemCallback(string text); //这种方法演示如何在线程安全的模式下调用Windows窗体上的控件. private void

vc 基于对话框多线程编程实例——线程之间的通信

 vc基于对话框多线程编程实例--线程之间的通信 实例: vc 基于对话框多线程编程实例--线程之间的通信,码迷,mamicode.com

Linux程序设计学习笔记----多线程编程之线程同步之条件变量

转载请注明出处:http://blog.csdn.net/suool/article/details/38582521. 基本概念与原理 互斥锁能够解决资源的互斥访问,但是在某些情况下,互斥并不能解决问题,比如两个线程需 要互斥的处理各自的操作,但是一个线程的操作仅仅存在一种条件成立的情况下执行,一旦错过不可再重现,由于线程间相互争夺cpu资源,因此在条件成立的时候,该线程不一定争夺到cpu而错过,导致永远得不到执行..... 因此需要某个机制来解决此问题,更重要的是,线程仅仅只有一种情况需要执

java多线程编程(一基础概念)

1.进程和线程       进程,是一个正在运行的程序实体,windows下常见的就是xxx.exe,在任务管理器中可以看见很多个进程.它是线程的容器. 线程,是进程中的一个执行流.在单线程编程中,我们的程序只有一个执行流:主线程的main方法.流,表明执行的过程是有顺序的,如main函数中的语句需要一条一条的按顺序执行,第一条语句没执行完,就不能去执行第二条语句. 可见,单线程编程是有限制的,那就是我们的语句只能串行执行,不可能发生某些语句同时执行的现象.有时我们希望某些代码并行执行,就好比我

Delphi 实现多线程编程的线程类 TThread

http://blog.csdn.net/henreash/article/details/3183119 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到, 但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了. 然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充. 线程本质上是进程中一段并发运行的代码. 一个进程至少有一个线程,即所谓的主线程. 同时还可以有多个

多线程编程之线程死锁问题

在多线程编程中,除了要解决数据访问的同步与互斥之外,还需要解决的重要问题就是多线程的死锁问题.所谓死锁: 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外部处理作用,它们都将无限等待下去. 一.死锁原因与形成条件 死锁形成的原因: 系统资源不足 进程(线程)推进的顺序不恰当: 资源分配不当 死锁形成的条件: 互斥条件:所谓互斥就是进程在某一时间内独占资源. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. 不剥夺条件:进程已获得资源,

linux_c 开发(6-1)多线程程序设计_线程基础

多线程 线程(thread)技术早在60年代就被提出来了,但真正应用多线程到操作系统中去,实在80年代中期,solaris是这方面的佼佼者.传统的UNIX也支持线程的概念,但是在一个进程中只允许有一个线程,这样多线程就意味着多进程.现在多线程技术已经被许多操作系统所支持,包括Windows/NT.Linux. 优点: 和进程相比,它是一种非常"节俭"的多任务操作方式.在linux系统下,启动一个新的进程必须分配给他独立的空间地址,建立众多的数据表来维护他的代码段.堆栈段和数据段,这是一