Java多线程,Runnable和Thread的详解

原创 2017年06月27日 14:06:53

并行和并发即相似又有区别的(微观概念)

并行:指两个或多个事件在同一时刻点发生;

并发:指两个或多个事件在同一时间段内发生。(单核CPU系统情况)

 

线程同步和异步的区别:

同步:就是指一个线程要等待上一个线程执行完之后才开始执行当前的线程,它们都同时操作一个数据,这时需要对数据进行保护,这个保护就是线程同步。

异步:是指一个线程去执行,它的下一个线程不必等待它执行完就开始执行,这两个线程没有什么关系,都可以各干各的。

 


多进程和多线程:

多进程:操作系统中同时运行多个程序;

多线程:在同个进程中同时运行多个任务。

 

进程和线程的区别:

进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程;

线程:堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互之间可以影响,又称为轻型进程或进程无。

Java程序的进程里至少包含主线程垃圾回收线程(后台线程)

因为一个进程中的多个线程是并发运行的,那么从微观角度上考虑也是有先后顺序的,那么哪个线程执行完全取决于CPU调度器(JVM来调度)程序员是控制不了的。

 

线程调度:

计算机通常只有一个CPU时,在任意时刻只能执行一条计算机指令,每个进程只有获得CPU的使用权才能执行指令。所谓多进程并发运行,从宏观上看其实是各个进程轮流获得CPU的使用权,分别执行各自的任务。那么,在可运行池中,会有多个线程处于就绪状态等待CPU,JVM就负责线程的调度。

JVM采用的是抢占式调度,没有采用分时调度,因此会造成多线程执行结果的随机性

 

多线程的优势:

多线程作为一种多任务、并发的工作方式,当然有其存在的优势:

1)  进程之间不能共享内存,而线程之间可以共享内存(堆内存);

2)  系统创建进程时需要为该进程重新分配系统资源。创建线程则代价小很多,因此实现多任务并发时,多线程效率更高。

3)  Java语言本身内置多线程功能的支持,而不是单纯的作为底层系统的调度方式,从而简化了多线程。

 

Java操作进程:

在Java中如何去运行一个进程

方式1:Runtime类的exec()方法;

       Runtime runtime =Runtime.getRuntime();

       runtime.exec(“notepad”);


方式2:ProcessBuilder类的start()方法;

       ProcessBuilder pd = newProcessBuilder(“notepad”);

       pd. start();

 

创建并启动线程:

方式1:继承Thread类

步骤:

1、定义一个类A继承于java.lang.Thread类;

2、在A类中覆盖Thread类中的run方法;

3、我们在run方法中编写需要执行的操作àrun方法里面的,线程执行体;

4、 在mian方法(线程)中,创建线程对象,并启动线程。

       创建线程类:                                A类 a = new A类();

       调用线程对象的start()方法:        a.start();//启动一个线程

 代码的实现:

//播放音乐的线程
class MusicThread extends Thread{
	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			System.out.println("播放音乐" + i);
		}
	}
}

//方式1:继承Thread类
public class ExtendsThreadDemo {
	public static void main(String[] args) {
		//主线程:运行游戏
		for (int i = 0; i < 50; i++) {
			System.out.println("打游戏"+i);
			if(i==10){
				//创建对象,并启动线程
				MusicThread music = new MusicThread();
				music.start();//启动一个新的线程,不能调用run方法
			}
		}
	}
}


方式2:实现Runnable接口

1、定义一个A类实现于java.lang.Runnable接口,注意A类不是线程类;

2、在A类中覆盖Runnable接口中的run方法;

3、我们在run方法中编写需要执行的操作àrun方法里面的,线程执行体;

4、在main方法(线程)中,创建线程对象,并启动线程。

       创建线程类对象:                     Thread t = new Thread(newA());

       调用编程对象的start()方法:     t.start();


代码的实现:

 

//播放音乐的线程类
class MusicRunnableImpl implements java.lang.Runnable{

	@Override
	public void run() {
		for (int i = 0; i < 50; i++) {
			System.out.println("播放音乐"+i);
		}
	}
	
}
//方式2:实现Runnable接口
public class ImplementsRunnableDemo {
	public static void main(String[] args) {
		//主线程:运行游戏
		for (int i = 0; i < 50; i++) {
			System.out.println("打游戏"+i);
			if(i==10){
				//创建对象,并启动线程
				Runnable target = new MusicRunnableImpl();
				Thread thread = new Thread(target);
				thread.start();
			}
		}

	}
}


使用匿名内部类来创建线程;

只适用于某一个类只使用一次的情况。


//使用内部类来创建线程
//值适用于某一个类只使用一次的情况
public class AnonymousInnerClassDemo {
	//方式1
	public static void main(String[] args) {
		// 主线程:运行游戏
		for (int i = 0; i < 50; i++) {
			System.out.println("打游戏" + i);
			if (i == 10) {
				// 创建对象,并启动线程
				new Thread(new Runnable() {
					@Override
					public void run() {
						for (int i = 0; i < 50; i++) {
							System.out.println("播放音乐" + i);
						}
					}
				}).start();
			}
		}
	}

	//方式2
	private static void test1() {
		// 主线程:运行游戏
		for (int i = 0; i < 50; i++) {
			System.out.println("打游戏" + i);
			if (i == 10) {
				// 创建对象,并启动线程
				new Thread() {
					@Override
					public void run() {
						for (int i = 0; i < 50; i++) {
							System.out.println("播放音乐" + i);
						}
					}
				}.start();
			}
		}
	}
}


继承和实现的选择:

继承方式:(继承Thread类)

1) Java中类是单继承的,如果继承了Thread类,该类就不能再有其他直接父类;

2) 从操作上分析,继承方式更简单,获取线程名字也简单;(操作上更简单)

3) 从多线程共享同一个资源上分析,继承方式不能做到。

实现方式:(实现Runnable接口)

1) Java中类可以多实现接口,此时该类还可以继承其他类,还可以实现其他接口;

2) 从操作上分析,实现方式操作更复杂,得使用Thread.currentThread()来获取当前线程的引用

3) 从多线程共享同一资源上分析,实现方式可以做到。(是否共享同一资源)


版权声明:欢迎以任何形式转载,但请注明作者和出处

JAVA多线程之Runnable和Thread比较

在我们开发的过程中常常会碰到多线程的问题,对于多线程的实现方式主要有两种:实现Runnable接口、继承Thread类。对于这两种多线程的实现方式也是有着一些差异。既然实现了多线程那必然离不开管理这些...
  • u013755987
  • u013755987
  • 2016年07月11日 21:15
  • 10750

Thread 和 Runnable 的区别

Thread 和 Runnable 的区别 实际上,Thread也是一个Runnable,它实现了Runnable接口,在Thread类中有一个Runnable类型的target字段,代表要被执...
  • import_sadaharu
  • import_sadaharu
  • 2016年08月03日 23:42
  • 3288

Thread和Runnable的区别

Thread 与Runnab le区别 博客分类: java 多线程ThreadRunnable  大家都知道多线程可以通过两种方式来创建。 一、通过继承Thread类 二...
  • xiaohuizi2009
  • xiaohuizi2009
  • 2012年06月06日 21:08
  • 11868

【Java并发编程】之六:Runnable和Thread实现多线程的区别(含代码)

Java中实现多线程有两种方法:继承Thread类、实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下...
  • mmc_maodun
  • mmc_maodun
  • 2013年12月06日 10:15
  • 37618

Java多线程之 Thread VS Runnable 【带案例】

为此,我们举个例子,假设有火车站有三个窗口,在卖火车票,总共只有5张票。每一个线程相当于一个窗口,分别售票 package com.thread; class myThread extends T...
  • uniquewonderq
  • uniquewonderq
  • 2015年08月31日 18:33
  • 1243

JAVA 几种多线程的简单实例 Thread Runnable

实例1:class Hello extends Thread{private String name;public Hello(){}public Hello(String name){this.na...
  • w_yunlong
  • w_yunlong
  • 2015年12月29日 11:58
  • 3237

Java中 Thread和Runnable实现多线程的区别和联系

Java有两种方式实现多线程,第一个是继承Thread类,第二个是实现Runnable接口。他们之间的联系: 1、Thread类实现了Runable接口。 2、都需要重写里面Run方法。 他们之间的区...
  • oxuanboy1
  • oxuanboy1
  • 2016年06月22日 12:18
  • 2307

java--(多线程创建的两种方式Thread类和Runnable接口)

(一)继承Thread类创建多线程----单线程 下面的代码是一个死循环,但是不会执行main里面的循环语句,而是run()里面的语句,这是因为该程序是一个单线程程序,当调用MyThread类的ru...
  • qq_32823673
  • qq_32823673
  • 2017年11月28日 17:24
  • 336

java再复习——多线程之初识线程,并从源码角度分析start与run方法,Thread类与Runnable接口

进程与线程的概念。 进程:是操作系统为一个程序分配内存空间的基本单位。 线程:存在于一个进程里,是程序执行的基本单元。线程才是负责是去执行程序的。 java创建线程的方式: 一:继承T...
  • sinat_31311947
  • sinat_31311947
  • 2017年03月05日 15:11
  • 593

多线程——Java中继承Thread类与实现Runnable接口的区别

线程我只写过继承Thread类的,后来知道java多线程有三种方式,今天首先比较一下常用的继承Thread类和实现Runnable接口的区别。               按着Ctrl键进入Threa...
  • xdd19910505
  • xdd19910505
  • 2016年02月24日 18:27
  • 5907
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java多线程,Runnable和Thread的详解
举报原因:
原因补充:

(最多只允许输入30个字)