在说线程原理前,我得先介绍一下到底什么是线程,简单的来说,线程就是不同的两件事,大家都知道现在的操作系统是多任务操作系统,但是它是如何实现多任务的呢,多线程便是它实现多任务的手段之一。那么什么又是进程?这个更容易理解了,每一个应用程序都是一个由一个或多个进程组成的,打开你电脑的任务管理看看就会十分清楚的看到很多个进程在进行着,好了,废话不多说了,进入主题吧。
首先,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.1、run()方法或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中线程的创建、同步、锁机制等重要知识点,帮助读者理解并掌握多线程编程的技巧。 针对数据库相关知识进行了详细的介绍,包括SQL语法、常用数据库管理系统(如MySQL、...
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
多线程与并发:这部分问题涉及到Java的线程模型、同步机制、并发工具类等。 JVM与性能优化:这部分问题涵盖了JVM内存模型、垃圾收集、性能调优等内容。例如,解释JVM的内存区域划分和作用;理解垃圾收集算法和调优...
它通常包含了对Java编程语言相关知识点的深入解释,例如Java基础、多线程、数据库操作、网络编程等。此外,Java面试手册还可能提供一些常见的面试问题及其解答,帮助读者更好地理解各种概念和技能,并在面试中有所...
常见Java面试问题:这些文档列出了常见的Java面试问题及其答案,包括基础问题、算法与数据结构、多线程、集合框架等。通过研读这些问题,您可以增加对Java面试可能涉及的各个领域的了解。 Java核心知识点总结:这些...
《Java程序员面试宝典》中的面试题不但以实例代码和流程图的形式对答案进行了详细解析,还对问题的相关知识点进行了扩展说明。希望通过《Java程序员面试宝典》,读者可以成功应聘,并提升综合素质。《Java程序员面试...
在以后的章节中,用通俗易懂的手法,紧密联系实际应用的方式,深入浅出地讲解了多线程,常用Java类,Java中的I/O(输入输出)编程,GUI与Applet,网络编程等方面的知识。 本书许多内容都来源于程序员圈子里的非正式...
净额从原生Java的Io操作(BIO)到NIO编程,约会NIO高效并发框架——Netty,需要用到Java的基础知识(多线程,网络编程,IO,设计模式尤其是代理模式),介绍了Netty的高级架构设计和核心模块组件,Google上的...
第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6...
理解和应用Java异常,常用类,IO,集合和多线程等开发技术。 课时安排 总学时:52学时 授课:48学时 (含约20学时实验) 考试:4学时 预备知识 了解和使用操作系统,...
Java SE重难点、包含但不限于集合、多线程、泛型、反射、I/O; Java Web重难点,包含但不限于Servlet、JSP、Tomcat、Jetty ; Java EE开发流行框架,包含但不限于Spring、MyBatis、Hibernate、Vert.X; 计算机理论...
计算机二级考试是全国计算机等级考试中的一个重要级别,旨在检验参加考试者对计算机基础知识和编程能力的...同时,由于Java语言的跨平台性和网络编程能力,相关的网络编程题目也可能会出现,如Socket编程、多线程编程等。
为了将课堂上得知识掌握得更加透 彻,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象 的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。让学生自己动 手动脑,将书本...
为了将课堂上得知识掌握得更加透 彻,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象 的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。让学生自己动 手动脑,将书本...
a:手上项目所需,因为项目主要的目的是实现多线程的数据推送;需要创建多线程的话,那就要处理好线程安全的问题;因为项目需要,还涉及到排队下载的功能,所以就选择了线程池来管理线程以及线程池里面的任务队列...
本书采用Java语言进行描述,针对Java技术标准编程进行详细的讲解,以简单通俗易懂的案例,逐步引领读者从基础到各个知识点进行学习。本书涵盖了JavaSE开发环境配置、程序设计基础、面向对象相关技术、常用API、UML...
基于Java多线程的并行计算技术研究及应用[J]. 华中师范大学学报(自然科学版) , 2005,(02) 赵智. JAVA语言多线程机制及其应用[J]. 南宁师范高等专科学校学报 , 2007,(03) . 王志和,王新辉. 基于Java的多线程实现...
针对性强,注重实际应用开发需求,书中所涵盖的知识点都是android应用开发者和系统开发者需要重点掌握的。 全书共10章,第1章介绍了阅读本书所需要做的准备工作,主要包括对android系统架构和源码阅读方法的介绍;...
关于能自定义格式的、支持多语言的、支持多数据库的代码生成器的想法 发布Oracle存储过程包c#代码生成工具(CodeRobot) New Folder XCodeFactory3.0完全攻略--序 XCodeFactory3.0完全攻略--基本思想 XCodeFactory...
Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,...