原创Java多线程详解(一)

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

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

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

Java对多线程的支持

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

1)继承Thread类

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

例如:

/*
 * @author [email protected]  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并自动发送给你)

时间: 2024-11-01 16:19:39

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

java多线程详解

转自:线程间通信.等待唤醒机制.生产者消费者问题(Lock,Condition).停止线程和守护线程.线程优先级 1  线程间通信 1.1  线程间通信 其实就是多个线程在操作同一个资源,但是操作的动作不同. 比如一个线程给一个变量赋值,而另一个线程打印这个变量. 1.2  等待唤醒机制 wait():将线程等待,释放了CPU执行权,同时将线程对象存储到线程池中. notify():唤醒线程池中一个等待的线程,若线程池有多个等待的线程,则任意唤醒一个. notifyAll():唤醒线程池中,所有

Java 多线程详解(二)------如何创建进程和线程

Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html 在上一篇博客中,我们已经介绍了并发和并行的区别,以及进程和线程的理解,那么在Java 中如何创建进程和线程呢? 1.在 Windows 操作系统中创建进程 在 windows 操作系统中,我们创建一个进程通常就是打开某个应用软件,这便在电脑中创建了一个进程.更原始一点的,我们在命令提示符中来做(我们以打开记事本这个进程为例): 第一步:windows+R,

Java 多线程详解(五)------线程的声明周期

Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程:http://www.cnblogs.com/ysocean/p/6883491.html Java 多线程详解(三)------线程的同步:http://www.cnblogs.com/ysocean/p/6883729.html Java 多线程详解(四)------生产者和消费者:http:/

Java 多线程详解(三)------线程的同步

Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程:http://www.cnblogs.com/ysocean/p/6883491.html 介绍完如何创建进程以及线程了,那么我们接着来看一个实例: 利用多线程模拟 3 个窗口卖票 第一种方法:继承 Thread 类 创建窗口类 TicketSell package com.ys.thread; p

Java多线程详解与晋级(一)

Java多线程详解与晋级(一) Java线程的概念与原理 一.操作系统中线程和进程的概念 进程是指操作系统内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. 简单来说,进程就是一个应用程序在操作系统上的一次执行过程,而线程是进程中的一次执行流程,进程包含多个线程在运行. 二.Java的线程 Thread类

Java多线程详解(二)

评论区留下邮箱可获得<Java多线程设计模式详解> 转载请指明来源 1)后台线程 后台线程是为其他线程服务的一种线程,像JVM的垃圾回收线程就是一种后台线程.后台线程总是等到非后台线程死亡之后,后台线程没有了服务对象,不久就会自动死亡,不再复活.利用setDaemon方法可以把一个线程设置为后台线程,但必须在线程启动之前调用. 例如 : /* * @author [email protected] */ public class DaemonThread extends Thread { pu

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

这是讲解 Java 多线程的第一章,我们在进入讲解之前,需要对以下几个概念有所了解. 1.并发和并行 并行:指两个或多个时间在同一时刻发生(同时发生): 并发:指两个或多个事件在一个时间段内发生. 在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单 CPU 系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替运行的时间是非常短的. 而在多个 CPU 系统中,则这些可以并发执行的程序便可以分配到多个处

java 多线程详解

线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synch

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

Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New):线程对象已经产生,但尚未被启动,所以无法执行.如通过new产生了一个线程对象后没对它调用start()函数之前.(2). 可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它. 当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它