`

java线程初探

    博客分类:
  • Java
阅读更多

    Java线程初探

       最近一段时间初学了一些java线程,写些体会,供大家一起交流学习。之前,一直都是编写单线程java程序,现在,初步学习线程,实现多线程的编写。

       线程是程序中一个单一的顺序控制流程,而进程是指一个内存中运行的应用程序。每个进程都有自己独立的一块内存空间,可以启动多个线程,这些多线程共享进程的内存。多线程的执行是并发的,也就是在逻辑上的同时。

       简单了解些线程的状态。线程对象一旦被创建后,就进入初始状态。当该对象调用start方法,就进入可运行状态。此后,当该对象被操作系统选中,获得CPU时间片就会进入运行状态。关于可运行状态和运行状态,就好比短跑中,一个是预备跑状态,一个是开跑以后状态。一个是具备了条件但没有去做,一个是已经做开了。进入运行状态后就可能会出现以下多种情况:


 

    (1)如果run方法或main方法结束,则线程进入终止状态。

    (2)如果线程调用了自身的sleep方法或其他线程的join方法,就会进入阻塞状态。当此方法结束后,该线程进入可运行状态,继续等待操作系统分配时间片。

    (3)如果线程调用了yield方法,回到可运行状态,这时与其他线程处于同等竞争状态,操作系统有可能会接着又让这个线程进入运行状态。

    (4)当线程刚进入可运行状态时,发现将要调用的资源被同步,获取不到锁标记,将会立即进入锁池状态,等待获取锁标记。一旦线程获得锁标记后,就转入可运行状态,等待操作系统分配CPU时间片。

    (5)如果线程调用wait方法,会进入等待队列,进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify或notifyAll方法才能被唤醒,线程被唤醒后进入锁池,等待获取锁标记。

对于(4),(5)看不懂的不要急,它们涉及到多线程的同步,后面会讲。(这里穿插介绍一个isAlive方法,用来判断线程是在运行中还是已经终止。具体运用见下图:

 public static void main(String[] args) {
		Judge test1=new Judge(1000,"test1");
		test1.start();
		Judge test2=new Judge(2000,"test2");
		test2.start();
		System.out.println(test1.isAlive()?"运行中":"已经终止");
		System.out.println(test2.isAlive()?"运行中":"已经终止");
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			System.out.println(e);
		}
		
		System.out.println(test1.isAlive()?"运行中":"已经终止");
		System.out.println(test2.isAlive()?"运行中":"已经终止");
		
		
		
		
	} 

 )

       现在再肤浅的认识一下线程优先级。java给每个线程安排优先级以决定与其他线程比较时该如何对待该线程。线程优先级是详细说明线程间优先关系的整数。作为绝对值,优先级毫无意义的;当只有一个线程时。优先级高的线程并不比优先级低的线程运行得快。相反,线程的优先级是用来决定何时从一个运行的线程切换到另一个,叫做上下文转换。决定上下文转换发生的规则:1>.线程可以自动放弃控制。在I/O未决定的情况下,睡眠或阻塞由明确的让步来完成。在这种假定下,所有其他的线程被检测,准备运行的最高优先级线程被授予CPU。2>.线程可以被高优先级的线程抢占。在这种情况下,虽然低优先级线程不主动放弃,但是无论处理器正在干什么,它都会被高优先级的线程占据。基本上,一旦高优先级线程要运行,它就执行,这叫做有优先级的多任务处理,具体代码如下:

package 线程优先级;

public class MyRunnable implements Runnable{
	public void run() {
		for(int i=0;i<10;i++){
    		System.out.println("线程2第"+i+"次执行");
    		try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

 

package 线程优先级;

public class MyThread1 extends Thread {
      
    public void run() {
    	for(int i=0;i<10;i++){
    		System.out.println("线程1第"+i+"次执行");
    		try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    }

	
}

 

package 线程优先级;
public class Priority {
      public static void main(String[] args) {
    	  Thread test1 = new MyThread1();
		 Thread test2 = new Thread(new MyRunnable());
//		 创建了两个线程test1和test2,并且分别为其设置了优先级为10和1
		 test1.setPriority(10);
		 test2.setPriority(1);
		 test1.start();
		 test2.start();
	}
}

       由于前面相应例子已经有关于多线程的实现,这里就简单提一下。第一种:继承Thread类,Thread类有两种构造方法:public Thread(),public Thread(Runnable r)(参数r成为被创建的目标对象。这个目标必须实现Runnable接口,给出该接口的run()方法的方法体,在方法体中实现操作),这种方式需要作为一个线程执行的类只能继承,扩充单一的父类;第二种:实现Runnable接口,它打破了扩充Thread类方式的限制。如果有一个类,它已继承了某个类,又想实现多线程,那就可以通过实现Runnable接口来创建线程。

        (注:本文资源来源于清华大学出版社的《高级程序设计语言(Java版)》,无任何商业目的,只是交流学习。)

 

 

 

 

 

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

相关推荐

    JAVA学习手册CHM版

    全书共20章,分为4篇进行介绍,第1篇为基础篇,包括Java开发前奏、搭建Java开发环境、 扎实Java语言基本语法、掌握算法和流程控制、使用Eclipse开发工具、探秘面向对象程序设计、初探Java数组;第2篇为核心篇,包括...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让...

    Netty初探:掌握高性能网络通信框架,提升Java网络编程技能

    Netty的线程模型,将IO操作和业务逻辑清晰地分离,使开发者可以专注于业务逻辑的开发。此外,Netty还提供了丰富的组件和工具,如Bootstrap、Channel、Selector、NioEventLoop等,让网络编程更加简单和高效。通过学习...

    Java-program-design-.rar_Java 8

    第1章-计算机基础 第2章-Java初探 第3章-Java程序基础 第5章-方法和数组 第8章-多线程。。。。。

    Web编程指南Web编程指南

    第14章 使用JAVA线程进行并发编程 第15章 JAVA中的客户/服务器编程 第3部分 CGI编程 第16章 超文本传输协议 第17章 CGI编程和其他——客户端 第18章 CGI编程及其他——服务器端 第4部分 JavaScript 第19章 ...

    单元测试初探之Java正则表达式引发的思考

    单元测试初探之Java正则表达式引发的思考.上周预发机器出了一个问题,CPU不定时会近100%满负载运行。重启以后就会恢复,之后又会到达100%,而且不会自恢复  情况回放:  上周预发机器出了一个问题,CPU不定时会近...

    C语言文件操作、多线程编程和网络编程.md

    目录: ...多线程编程初探 3.1 线程的基本概念 3.2 创建与同步线程 网络编程基础 4.1 套接字的概念与创建 4.2 服务器与客户端通信 高级文件操作 5.1 顺序文件与随机文件 5.2 文件的读写位置与偏移

    java8源码-tp-practice:千里之行,始于足下

    OAuth2.0初探 学习编写 REST 接口测试用例 学习自定义 validator 学习自定义 filter 学习自定义 interceptor 自定义 aspect 学习 REST 接口多线程编程 Thread#start Thread#stop spring boot 1.5.20.RELEASE spring ...

    Go语言初探 搭建Mac环境

    但是,大多数现代编程语言(如Java,Python等)都来自90年代的单线程环境。虽然一些编程语言的框架在不断地提高多核资源使用效率,例如 Java 的 Netty 等,但仍然需要开发人员花费大量的时间和精力搞懂这些框架的...

    Android开发技巧总汇(续)

    Android开发技巧总汇(续)又收集了两份关于android开发的写技巧知识,主要关于Activity,Context menus,Android自动化测试初探,java mail包实现发Gmail邮件,线程的处理,四种动画等等

    C语言高级编程技巧与数据结构.md

    目录: 函数指针与回调函数 1.1 函数指针的定义与使用 1.2 回调函数的概念 枚举与位操作 2.1 枚举类型的定义与应用 2.2 位操作与位运算 ...多线程编程初探 6.1 线程的基本概念 6.2 创建与同步线程

    《Android应用开发揭秘》源码

     6.1 Android数据存储初探  6.2 数据存储之Shared Preferences  6.3 数据存储之Files  6.4 数据存储之Network  6.5 Android数据库编程  6.5.1 SQLite简介  6.5.2 SQLite编程详解  6.5.3 SQLiteOpenHelper...

    Android应用开发揭秘

    6.1 Android数据存储初探 6.2 数据存储之Shared Preferences 6.3 数据存储之Files 6.4 数据存储之Network 6.5 Android数据库编程 6.5.1 SQLite简介 6.5.2 SQLite编程详解 6.5.3 SQLiteOpenHelper应用 6.6 数据共享...

    android开发揭秘PDF

    2.2.1 安装JDK和配置Java开发 环境 2.2.2 Eclipse的安装与汉化 2.2.3 SDK和ADT的安装和 配置 2.3 创建第一个Android项目——HeUoAndroid 2.3.1 创建HelloAndroid项目 2.3.2 运行HelloAndroid及模拟器的使用 2.3.3 ...

    《Android应用开发揭秘》附带光盘代码.

     2.2.1 安装JDK和配置Java开发  环境  2.2.2 Eclipse的安装与汉化  2.2.3 SDK和ADT的安装和  配置  2.3 创建第一个Android项目——HeUoAndroid  2.3.1 创建HelloAndroid项目  2.3.2 运行HelloAndroid及...

    Android应用开发揭秘pdf高清版

    6.1 Android数据存储初探 6.2 数据存储之Shared Preferences 6.3 数据存储之Files 6.4 数据存储之Network 6.5 Android数据库编程 6.5.1 SQLite简介 6.5.2 SQLite编程详解 6.5.3 SQLiteOpenHelper应用 6.6 数据共享...

Global site tag (gtag.js) - Google Analytics