`
沈冠军
  • 浏览: 111233 次
  • 性别: Icon_minigender_1
  • 来自: 玉林
社区版块
存档分类
最新评论

java多线程及其相关知识点

阅读更多



 在说线程原理前,我得先介绍一下到底什么是线程,简单的来说,线程就是不同的两件事,大家都知道现在的操作系统是多任务操作系统,但是它是如何实现多任务的呢,多线程便是它实现多任务的手段之一。那么什么又是进程?这个更容易理解了,每一个应用程序都是一个由一个或多个进程组成的,打开你电脑的任务管理看看就会十分清楚的看到很多个进程在进行着,好了,废话不多说了,进入主题吧。

首先,Java中创建线程的有两种方法,第一种是创建一个类来继承Thread类,那么每个该类的对象都是一个线程了,只要在必要的地方创建对象调用start方法即可启动线程,线程有什么用呢?学过java的人都知道,一个Java应用总是从main()方法开始运行,mian()方法运行在一个线程内,它被称为主线程,同一个线程内程序的运行是从代码的上到下运行的,是一步步执行的。试想一下如果移动公司让你来编写一个查找用户的系统,假如你的程序只有一个主线程,那么得到猴年马月才能查找出一个用户啊(你得知道,移动的用户可是有几个亿那么多啊,大哥)?呵呵,这就得用多线程来解决啦,只要你启动N个线程来分段查找,那么需要的时间必然是大大减少的,仅仅知道了多线程的好处是不行的,还得掌握它才行,

大道理说了这么多,下面看看一个简单的线程例子吧!

//创建一个线程类,让它继承Thread
public class Mythread extends Thread {
	private int ID;// 用于线程的标志

	public Mythread(int ID) {
		this.ID = ID;
	}

	// 重写Thread中的run方法
	public void run() {
		int count = 0;
		while (true) {
			count++;
			System.out.println(ID+"线程输出的第" + count + "个数据");
			try {
				// 让线程休息1秒,否占用CUP过高
				Thread.sleep(1000);
			} catch (Exception ef) {
				ef.printStackTrace();
			}
		}

	}

}

 

 

public class StartThread {

	public static void main(String[] args) {
		// 启动五个线程
		for (int i = 0; i < 5; i++) {
			Mythread thread = new Mythread(i);
			thread.start();
		}

		// 创建线程对象的另外一种方法,通过匿名内部类实现Runnable接口来创建
		java.lang.Runnable run = new java.lang.Runnable() {

			public void run() {
				int count = 0;
				while (true) {
					count++;
					System.out.println("Runnable线程输出" + count);

					try {
						Thread.sleep(1000);
					} catch (Exception ef) {
						ef.printStackTrace();
					}
				}

			}

		};
		//创建线程
		Thread th=new Thread(run);
		//启动线程
		th.start();

	}

}

 

运行程序,可以看到输出的结果为:

0线程输出的第1个数据

1线程输出的第1个数据

2线程输出的第1个数据

4线程输出的第1个数据

3线程输出的第1个数据

Runnable线程输出1

0线程输出的第2个数据

1线程输出的第2个数据

2线程输出的第2个数据

3线程输出的第2个数据

4线程输出的第2个数据

Runnable线程输出2

1线程输出的第3个数据

2线程输出的第3个数据

0线程输出的第3个数据

3线程输出的第3个数据

4线程输出的第3个数据

细心的你或许会发现,线程前面的编号不每次打印的顺序都一样的,这就涉及到了线程的同步啦,再说这个前,先说一下线程的几种状态,其结构图(此图是COPY过来的,呵呵)如下:

 

 

 在这里对图解释一下:

 1、当我们new了这个对象后,线程就进入了初始状态;

 2、当该对象调用了start()方法,就进入可运行状态;

 3、进入可运行状态后,当该对象被操作系统选中,获得CPU时间片就会进入运行; 

 4、进入运行状态后情况就比较复杂了

    4.1run()方法或main()方法结束后,线程就进入终止状态;

    4.2、当线程调用了自身的sleep()方法或其他线程的join()方法,就会进入阻塞状态(该状态既停止当前线程,但并不释放所占有的资源)。当sleep()结束或join()结束后,该线程进入可运行状态,继续等待OS分配时间片

    4.3、线程调用了yield()方法,意思是放弃当前获得的CPU时间片,回到可运行状态,这时与其他进程处于同等竞争状态,OS有可能会接着又让这个进程进入运行状态;

   4.4、当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchroniza(同步),获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入可运行状态,等待OS分配CPU时间片;

   4.5、当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。

何谓多线程同步?因为多线程给你提了程序的异步执行的功能,所以在必要时必须还提一种同步机制。例如,你想两个线程通讯并共享一个复杂 的数据结构,你需要一种机制让他们相互牵制并正确执行,这就像生产者/消费者机制一样,为这个目的,Java用一种叫监视器(monitor)的机制实现了进程间的异步执行。可以将监视器看作是一个很小的盒子,它只能容纳一个线程。一个线程进入一个监视器,所有其他线程必须等到第一个线程退出监视器后才能进入;监视器可以设计成保护共享的数据不被多个线程同时操 作。大多数多线程系统将监视器设计成对象,Java提了一种更清晰的解决 方案。没有Monitor类;每个对象通过将他们的成员函数定义synchronized来定义自己的显式监视器,一 个线程执行在一个synchronized函数 里, 其他任何线程都不能调用同一个对象的synchronized函 数。

以上有自己的思想,也有从别人那得来的,呵呵···

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 42.2 KB
分享到:
评论

相关推荐

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    以上就是Java多线程设计模式的一些关键知识点,理解并熟练运用这些模式,将有助于编写出高效、稳定、易于维护的多线程程序。通过阅读《java多线程设计模式》这本书,你可以深入理解这些概念,并学习到更多实际应用的...

    Java 模拟线程并发

    最后,Java并发库还包含了很多其他有用的工具,如Semaphore(信号量)用于控制同时访问特定资源的线程数量,CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)用于多线程间的协作,以及Lock接口及其实现如...

    深入学习:Java多线程编程

    《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...

    java多线程学习资料

    ### Java多线程学习资料知识点解析 #### 一、引言 Java作为一种广泛使用的编程语言,在并发编程领域具有独特的优势。多线程是Java中实现并发处理的核心技术之一,能够显著提升程序的性能和响应性。本文将深入探讨...

    Java多线程的其他知识_动力节点Java学院整理

    除了线程组和异常处理,Java多线程还包括许多其他重要概念,如线程的生命周期(新建、可运行、运行、阻塞和死亡),同步机制(synchronized关键字、Lock接口及其实现如ReentrantLock),线程间的通信(wait()、...

    Java多线程并发实战

    ### Java多线程并发实战知识点解析 #### 一、引言 在计算机科学领域,**多线程**和**并发**技术是现代软件开发中不可或缺的一部分。随着处理器核心数量的增加,利用多线程和并发可以显著提高应用程序的性能和响应...

    java多线程面试题和答案

    在Java编程领域,多线程是一项至关重要...这些面试题和答案覆盖了Java多线程的核心知识点,有助于深入理解和掌握Java并发编程。在实际项目中,理解并熟练运用这些概念能够帮助开发者构建出更加高效、健壮的多线程应用。

    java多线程详解

    在深入探讨Java多线程之前,我们首先需要理解线程与进程的基本概念及其区别。进程是资源分配的基本单位,拥有独立的内存空间,而线程则是进程内的执行单元,共享所属进程的内存资源。线程相较于进程而言,创建和切换...

    java多线程面试相关问题

    Java多线程是Java编程中的重要组成部分,尤其在面试中,多线程相关的知识点往往成为衡量开发者技术深度的标准。以下是对这些核心问题的详细解答: 1. **Java中多线程同步**:Java多线程同步是通过锁机制来确保共享...

    Java多线程技术(实验)

    ### Java多线程技术知识点详解 #### 一、实验目的 本实验旨在帮助学习者深入理解Java中的多线程编程技巧。具体目标包括: 1. **掌握Java中的多线程编程**:熟悉如何在Java中利用多线程来提高程序性能和响应能力。...

    超实用的Java并发多线程教程

    以上就是Java并发多线程的核心知识点,理解和掌握这些内容对于编写高效、稳定的多线程程序至关重要。在实际开发中,根据需求选择合适的方式实现并发,并充分考虑线程安全、性能和资源管理等因素,才能写出高质量的...

    java多线程使用知识点问题详解.docx

    本文将深入探讨Java多线程的使用及其相关知识点。 首先,我们需要了解多线程的基本概念。程序(Program)是一组指令的集合,是静态的代码实体。而进程(Process)是程序在执行时的实例,它具有动态的生命周期,包括...

    Java多线程运算集合

    ### Java多线程运算集合知识点解析 #### 一、Java多线程概念与原理 - **操作系统中的线程与进程**: - **进程**:指的是一个正在运行的应用程序,每个进程都拥有独立的内存空间。 - **线程**:是进程中的一个...

    深入浅出Java多线程程序设计

    ### 深入浅出Java多线程程序设计 #### 知识点一:理解多线程机制 多线程是一种让程序中的多个指令流能够并发执行的机制,每个指令流被称为一个线程,它们之间相对独立。线程与进程不同,主要体现在资源分配和隔离...

    java多媒体与多线程处理实验

    ### Java多媒体与多线程...通过本次实验,学生不仅掌握了Java多线程编程的基础知识,还学会了如何利用多线程优化程序性能,特别是在多媒体应用领域,如动画、音视频处理等,为后续更复杂的应用开发奠定了坚实的基础。

    Java多线程和并发知识整理

    Java多线程和并发知识是Java开发...以上内容涵盖了Java多线程和并发编程的主要知识点,从理论到实践,从基础到高级,全面解析了并发编程的核心概念和工具。掌握这些知识,开发者可以编写出高效、可靠的多线程应用程序。

    Java多线程机制及其在socket编程中的应用.pdf

    标题和描述中提到的“Java多线程机制及其在socket编程中的应用.pdf”,暗示了文章的两大核心内容:Java多线程技术和这些技术如何应用于socket编程。为了深入探讨这些内容,我们首先需要了解Java多线程的几个关键知识...

    java简单分布式架构,多个数据源,线程池多线程访问

    综上所述,这个项目涉及到的知识点包括:分布式系统设计、Java多线程与线程池、Spring框架的多数据源支持、MyBatis的使用以及Spring的事务管理。通过这些技术的组合,可以构建出一个高效、可扩展的分布式应用,以...

    java多线程+Socket+Swing做的局域网聊天程序

    【标题】"java多线程+Socket+Swing做的局域网聊天程序"涉及的核心知识点主要涵盖Java编程、多线程、网络通信以及图形用户界面设计。以下将详细阐述这些关键概念及其在实现局域网聊天程序中的应用。 **1. Java编程**...

Global site tag (gtag.js) - Google Analytics