只看书不实践是不行的。来实践一下~~~~~~(引用请指明来源)

先看看百科对多线程的介绍

多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。[1] 在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。

每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。
线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。

http://baike.baidu.com/view/65706.htm?fr=aladdin

Java对多线程的支持

Java创建多线程的3种常用方法:

1)继承Thread类

重写Thread类的run方法,创建Thread子类实例,启动线程。

例如:

/*
* @author wxismeit@163.com wangxu
*/
public class TreadOfextends extends Thread{
private int i;
//重写run()方法
public void run(){
for(i=0; i<50; i++){
System.out.println(getName() + " " + i);
//继承Thread类时直接使用this即可获取当前线程
}
} public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
for(int i=0; i<50; i++){
if(i == 10){
//直接通过创建类对象来调用start()方法
new TreadOfextends().start();
new TreadOfextends().start();
}
} } }

2)实现Runnable接口

重写run()方法,创建Runnable实例作为Thread的target。

例如:

public class ThreadOfRun implements Runnable {

	private int i;
//实现Runnable接口中的run()方法
public void run() {
for(i=0; i<50; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
//通过实现接口来实现多线程 就不能通过this关键字来获取当前进程
}
}
public static void main(String[] args) {
for(int i=0; i<50; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if(i == 10) {
ThreadOfRun tor = new ThreadOfRun();
//此处需要通过Thread的构造方法来new线程
new Thread(tor , "线程1").start();
new Thread(tor , "线程2").start();
}
} } }

3)Java 5以后可以通过更强大的手段——实现Callable接口

使用FutureTask对象作为Thread的对象的target创建并启动新线程

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; public class ThreadOfCallble implements Callable<Integer> {
//支持泛型
public Integer call() throws Exception {
int i;
for(i=0; i<50; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
return i;//有返回值
}
public static void main(String[] args) {
//创建Callable对象
ThreadOfCallble toc = new ThreadOfCallble();
//通过FutureTask来包装Callable对象
FutureTask<Integer> ft = new FutureTask<Integer>(toc);
for(int i=0; i<50; i++) {
if(i ==10) {
new Thread(ft , "NewThread").start();
}
}
try {
//得到新线程的返回值
System.out.println("子线程的返回值 : " + ft.get());
}catch(Exception e) {
e.printStackTrace();
}
}
}

三种方式的对比 : 后两种方法非常适合多个相同的线程来处理同一份资源的情况,可以将CPU,代码和数据分开,比较符合面向对象的思想,而且还可以继承其他类,所以一般采用后两种方法。

线程的生命周期 : 新建和就绪状态 ——>运行和阻塞状态——>线程死亡(不可复活)。

如图:(看不到请拖动图片)

join线程

当在某个程序执行中调用其他线程的join方法时,条用线程将被阻塞,直至被join线程执行完为止。

<pre class="java" name="code">
public class ThreadOfjoin extends Thread { public ThreadOfjoin(String name) {
super(name);
} public void run() {
for(int i=0; i<50; i++) {
System.out.println(getName());
}
}
public static void main(String[] args) {
new ThreadOfjoin("NewThread").start();
for(int i=0; i<50; i++) {
if(i == 10) {
ThreadOfjoin toj = new ThreadOfjoin("JoinedThread");
toj.start();
try {
toj.join();//主线程调用了toj的join方法,需要等toj执行完主线程才能执行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()); } } }

未完待续  : 线程优先级,线程同步,互斥锁,同步锁,死锁,线程通信。

评论区留下Email可以获得《Java多线程设计模式》PDF版(通过网络爬虫小程序  自动匹配抓取你的Email并自动发送给你)

原创Java多线程详解(一)的更多相关文章

  1. Java 多线程详解(四)------生产者和消费者

    Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...

  2. Java多线程详解(二)

    评论区留下邮箱可获得<Java多线程设计模式详解> 转载请指明来源 1)后台线程 后台线程是为其他线程服务的一种线程,像JVM的垃圾回收线程就是一种后台线程.后台线程总是等到非后台线程死亡 ...

  3. java多线程详解(6)-线程间的通信wait及notify方法

    Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...

  4. Java多线程详解

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

  5. Java 多线程详解(一)------概念的引入

    这是讲解 Java 多线程的第一章,我们在进入讲解之前,需要对以下几个概念有所了解. 1.并发和并行 并行:指两个或多个时间在同一时刻发生(同时发生): 并发:指两个或多个事件在一个时间段内发生. 在 ...

  6. Java多线程详解(转载)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用 ...

  7. java多线程详解(8)-volatile,Atomic比较

    在变成过程中我们需要保证变量的线程安全,在java中除了使用锁机制或者Threadlocal等保证线程安全,还提供了 java.util.concurrent.atomic.Atomic*(如Atom ...

  8. java多线程详解(7)-线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, 这样频繁创建线程就会大大降低系 ...

  9. java多线程详解(5)-Threadlocal用法

    ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路. 使用这个工具类可以很简洁 ...

随机推荐

  1. linux gpio控制之sysfs接口

    在3.14及之后的linux中对gpio提供了sysfs接口,说明文档:Documents/gpio/sysfs.txt. Platforms which use the "gpiolib& ...

  2. 2016年第七届蓝桥杯C/C++程序设计本科B组省赛

    /* 2016年第七届蓝桥杯C/C++程序设计本科B组省赛 煤球数目(结果填空) 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形) ...

  3. stm32独立看门狗

    转载:http://blog.sina.com.cn/s/blog_7f1dc53b01010mqa.html 实验现象: 开始LED1亮,LED2熄灭,若不隔时间按KEY1则发现LED2因独立看门狗 ...

  4. 实现对div的显示隐藏

    jQuery对div的显示和隐藏: 显示: 复制代码 代码如下:$("#id").show() 隐藏: 复制代码 代码如下: $("#id").show() j ...

  5. seo 基础

    标题用<h2>标题</h2>  iamge  中加上 alt=“”   的属性 这样有利用百度的搜索引擎爬虫搜索到

  6. python_matplotlib知识点总结

    文作为学习过程中对matplotlib一些常用知识点的整理,方便查找. 强烈推荐ipython无论你工作在什么项目上,IPython都是值得推荐的.利用ipython --pylab,可以进入PyLa ...

  7. 一个极其高效的虚拟机内存冗余消除机制:UKSM

    Linux内核机制KSM(Kernel Samepage Merging)能合并KVM虚拟机之间相同内存的页面,被CentOS, RHEL之类的服务器内核广泛采用,但是其速度很慢.UKSM(Ultra ...

  8. RBAC 基于角色的访问控制

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  9. c# winform 自动关闭messagebox 模拟回车

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. MathType在字母上加虚线的方法

    在数学中根据不同的需要,会对其中的公式或变量字母作不同的标记.这些标记在用MathType编辑数学公式时同样也要准确地编辑出来,例如在字母上方加虚线.这种数学样式在使用时也是根据自己的数学问题来使用的 ...