`

Java学习系列(十四)Java面向对象之细谈线程、线程通信(上)

 
阅读更多

线程与进程的关系

进程 --运行中的程序。进程有如下特征:
1).独立性。拥有自己的资源,拥有自己独立的内存区。
通常来说,一个进程的内存空间,是不允许其他进程访问的。
但像Windows,如A进程可以通过某种方式修改其他进程的内存值。
2).动态性。程序是静止的,运行起来才叫进程。
3).并发性。一个操作系统可以同时“并发(concurrent)”运行多个进程。
线程 --进程中的“并发(concurrent)”执行流,轻量级进程。

线程与进程的典型区别:Process(进程)是有独立内存的,因此创建Process的成本比创建线程的成本高。

 

什么是“并发”?什么是“并行”?
1)并发:即使只有一个CPU,多个进程、或多个线程在CPU上【快速轮换】的执行。在同一个时刻,只有与CPU个数相同的进程真正在执行,其他进程都处于等待状态。--对用户来说,[感觉]是多个进程在同时执行。

2)并行(Parallel):必须有一个以上的cpu,在同一时刻,至少有与CPU个数相同的进程[真正]在执行。

多线程的好处
1)功能上类似多进程;
2)创建成本低,效率高;
3)所有线程共享进程的内存,因此线程之间的通信非常方便。

Java创建多线程的方法(3种):(注意 Java默认有个main方法主线程的执行体)

启动线程:调用Thread对象的start()方法,千万不要调用run()方法。就是普通方法的调用,就不会启动多线程了。
a)继承Thread,重写一个run()方法,---这个run方法就是线程执行体(就是该线程将要做的事情)。
举列说明1:

public class Test extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			// Thread.currentThread()用于获取当前正在运行的线程
			System.out.println(Thread.currentThread().getName() + ",i=" + i);
		}
	}


	public static void main(String[] args) {
		new Test().start();// 创建匿名实例并启动线程
	}
}

b)实现Runnable接口,重写run方法。--推荐
举例说明2:

public class Test implements Runnable {
	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			// Thread.currentThread()用于获取当前正在运行的线程
			System.out.println(Thread.currentThread().getName() + ",i=" + i);
		}
	}


	public static void main(String[] args) {
		new Thread(new Test()).start();// 这里把Runnable对象包装成Thread对象。
	}
}

c)实现Callable(就是Runnable增强版),重写call方法(有返回值,可以声明抛出异常)。
举例说明3:

public class Test implements Callable<Integer> {
	@Override
	public Integer call() throws Exception {
		for (int i = 0; i < 100; i++) {
			// Thread.currentThread()用于获取当前正在运行的线程
			System.out.println(Thread.currentThread().getName() + ",i=" + i);
		}
		return 100;
	}


	public static void main(String[] args) {
		// 将Callable包装成FutureTask,再包装成Thread,最后启动线程
		new Thread(new FutureTask<Integer>(new Test())).start();
		;
	}
}

 

创建线程方式的对比,创建线程的方式可分为2类:
1。继承Thread类;2。实现Runnable或Callable接口。

总的来说,实现接口的方式更好,原因如下:
1.实现接口之后,依然可以继承其他类;但如果继承了Thread类,就无法继承其他类了。
2.实现接口时,可以让多个线程共享同一个Runnable对象。可以更好的实现代码与数据的分离,形成更清晰的逻辑。

线程的状态(当调用start()方法之后,只是启动了线程,线程并不会立即执行):
新建:刚刚创建出来的Thread对象。
就绪:调用start()之后,处于就绪状态。
从就绪到运行:是不可控的,靠线程调度器来分配。
从就绪到运行:靠线程调度器来分配(yield()方法可以主动的让出cpu,进入就绪状态)。
阻塞:调用sleep()、IO阻塞、等待同步锁、等待通知等将进入阻塞Blocked状态;sleep()时间到、IO阻塞解除、获取同步锁、收到通知后等将进入就绪状态。
正常死亡:线程执行体执行完成;遇到了未捕获的异常。

控制线程的方法:

Join线程:启动一条线程,多条线程并发执行,被joined线程必须先执行完成。
举例说明:

class JoinThread extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			// Thread.currentThread()用于获取当前正在运行的线程
			System.out.println(Thread.currentThread().getName() + ",i=" + i);
		}
	}
}


public class Test {
	public static void main(String[] args) throws InterruptedException {
		JoinThread jt1 = new JoinThread();
		JoinThread jt2 = new JoinThread();
		for (int i = 0; i < 100; i++) {
			System.out.println("主线程正在执行:i=" + i);
			if (i == 20) {
				// 主线程执行到此处时,必须等到jt1、jt2执行完后,主线程才能继续向下执行。
				jt1.start();
				// 將jt1这条进程join进来, 等待jt1线程终止。
				jt1.join();
				jt2.start();
				jt2.join();
			}
		}
	}
}

后台线程(Daemon Thread):又称守护线程、精灵线程。如果所有的前台线程结束,它会自动死亡。JVM的垃圾回收器就是一个典型的后台进程。调用Thread对象的setDaemon(true)方法可将指定线程设置为后台线程。

 

线程暂停:Thread.sleep(100):让线程暂停100ms,并且进入阻塞状态。--推荐(更稳定)
线程让步:Thread.yield():让线程让出cpu,并进入就绪状态。

改变线程的优先级:优先级越高,线程会获得更多的执行机会。
举例说明:(优先级高的先执行)

class PriorityThread extends Thread {
	@Override
	public void run() {
		for (int i = 0; i < 100; i++) {
			// Thread.currentThread()用于获取当前正在运行的线程
			System.out.println(Thread.currentThread().getName() + ",i=" + i);
		}
	}
}


public class Test {
	public static void main(String[] args) throws InterruptedException {
		PriorityThread jt1 = new PriorityThread();
		jt1.setPriority(Thread.MIN_PRIORITY);
		PriorityThread jt2 = new PriorityThread();
		jt2.setPriority(Thread.MAX_PRIORITY);
		jt1.start();
		jt2.start();
		System.out.println("~~~~~~主线程结束~~~~~");
	}
}

 

 

分享到:
评论

相关推荐

    面向对象程序设计JAVA 多线程自学教程ppt

    面向对象程序设计JAVA 多线程自学教程ppt

    漫画面向对象编程 Java

    面向对象的简、由类创建一个对象的方法、类的编写与对象的创建、类的构造函数、类的方法、修饰符、Java中的封装/继承/多态等特征、Java中的线程、用Java创建一个小世界、多线程共享数据,以及面向对象中的各种设计...

    java面向对象编程源码

    全书内容包括面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、输入/输出和GUI编程等。其最大特色是以六条主线贯穿全书:面向对象编程思想、Java语言的语法、Java虚拟机...

    Java 线程通信示例 源代码

    Java 线程通信示例 源代码 多线程之间通信,值得收藏

    java多线程通信图解

    java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...

    Java面向对象软件开发

    1-面向对象软件开发概述;2-Java语言概述;3-java语言基础;4-面向对象程序设计1;5-面向对象程序设计2;6-工具类与算法;7-图形用户界面设计与实现;8-Java高级编程1(异常处理);8-Java高级编程2(多线程);8-Java高级...

    面向对象与多线程java实验.zip

    武汉理工大学面向对象与多线程Java综合实验源码 完成时间:2020/11/11 实验目的 运用Java语言,以迭代方式逐步编程实现一个小型档案管理系统。由此了解软件开发的一般过程,深入理解面向对象语言的基本概念和基本...

    java面向对象程序设计

    全书共13章,内容包括Java介绍、面向对象编程中的对象、由对象展开的Java基本数据类型、运算符、数组、方法、类的定义、对象的使用、Java类库、继承、接口、多态、异常处理、可视化程序开发、多线程等。本书重点落在...

    Java面向对象程序设计:第2版:英文

    全书共12章,内容包括面向对象程序设计概述,Java语言概述,Java语言基础,类、对象和接口,包和Java基础类,Java异常处理,Java图形用户界面设计,Applet及其应用,I/O系统,多线程编程,多媒体编程和网络编程等。

    java线程 线程学习资料 java线程教程

    java线程 线程 教程 java线程教程 java线程学习资料 本教程有什么内容? 本教程研究了线程的基础知识— 线程是什么、线程为什么有用以及怎么开始编写使用线程的简单 程序。 我们还将研究更复杂的、使用线程的应用...

    java tcp多线程通信

    java tcp socket 多线程多句通信

    一个JAVA版象棋,面向对象编程,绘图,线程,都有体现

    完全面向对象编程,大家可以参考参考。。利用到了JAVA绘图技术……

    精通Java:JDK、数据库系统开发Web开发(实例代码)

    《精通Java:JDK、数据库系统开发Web开发》全书共分27章,内容涵盖了Java编程环境概述、基础语法、面向对象软件设计方法、线程、数据集合、网络编程、图形编程、多媒体编程以及Java Web开发。本书每一节的例子都是...

    Java多线程编程总结

    Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...

    C++面向对象多线程编程

    《C++面向对象多线程编程》共分13章,全面讲解构建多线程架构与增量多线程编程技术。第1章介绍了用于构建面向对象程序的不同类型C++组件,以及如何使用这些组件来构建多线程架构。第2、3、4章简要介绍进程、线程、多...

    孙卫琴java面向对象编程(答案及源码)

    本书内容包括:面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、泛型、Annotation标注、输入/输出和GUI编程,以及JDK8引入的如虎添翼的新特征,比如支持函数式编程的...

    JAVA面向对象编程(孙卫琴).z02

    全书内容包括面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、输入/输出和GUI编程等。其最大特色是以六条主线贯穿全书:面向对象编程思想、Java语言的语法、Java虚拟机...

    Java学习必要的软件包

    Java是一门面向对象编程...Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 [2] 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 [3] 。

    JAVA多线程学习内容

    JAVA多线程学习,提高JAVA性能,多线程并列. JAVA高级学习内容。

    Java线程讲解Java线程讲解

    Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解

Global site tag (gtag.js) - Google Analytics