`
men4661273
  • 浏览: 275643 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java多线程编程记录(一)

    博客分类:
  • java
阅读更多
参考:http://hi.baidu.com/xiaolincc26/home ——疯狂大白菜

在 Java 中,“线程”指两件不同的事情:
1、java.lang.Thread 类的一个实例;
2、线程的执行。 
使用 java.lang.Thread 类或者 java.lang.Runnable 接口编写代码来定义、实例化
和启动新线程。 
一个 Thread 类实例只是一个对象,像 Java 中的任何其他对象一样,具有变量和方
法,生死于堆上。 

Java 中,每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在
后台运行着。 
一个 Java 应用总是从 main()方法开始运行,mian()方法运行在一个线程内,它被
称为主线程。 
一旦创建一个新的线程,就产生一个新的调用栈。 
线程总体分两类:用户线程和守候线程。
当所有用户线程执行完毕的时候,JVM 自动关闭。但是守候线程却不独立于 JVM,守
候线程一般是由操作系统或者用户自己创建的。

线程的定义: :
1.实现Runnable接口
void  run()
使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独
立执行的线程中调用对象的 run 方法。 
方法 run 的常规协定是,它可能执行任何所需的操作
2、扩展 java.lang.Thread 类。
此类中有个 run()方法,应该注意其用法:
public void run()
如果该线程是使用独立的 Runnable 运行对象构造的,则调用该
Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 
Thread 的子类应该重写该方法。

实例化线程  
1、如果是扩展 java.lang.Thread 类的线程,则直接 new 即可。
 
2、如果是实现了 java.lang.Runnable 接口的类,则用 Thread 的构造方法:
Thread(Runnable target) 
Thread(Runnable target, String name) 
Thread(ThreadGroup group, Runnable target) 
Thread(ThreadGroup group, Runnable target, String name) 
Thread(ThreadGroup group, Runnable target, String name, long stackSize) 

启动线程
 
在线程的 Thread 对象上调用 start()方法,而不是 run()或者别的方法。
Crazy Cabbage
http://hi.baidu.com/xiaolincc26/home ——疯狂大白菜


5
 
在调用 start()方法之前:线程处于新状态中,新状态指有一个 Thread 对象,但还
没有一个真正的线程。
 
在调用 start()方法之后:发生了一系列复杂的事情
启动新的执行线程(具有新的调用栈);
该线程从新状态转移到可运行状态;
当该线程获得机会执行时,其目标 run()方法将运行。
 
注意:对 Java 来说,run()方法没有任何特别之处。像 main()方法一样,它只是新
线程知道调用的方法名称(和签名)。因此,在 Runnable 上或者 Thread 上调用 run
方法是合法的。但并不启动新的线程。
例子:
1、实现 Runnable 接口的多线程例子

package com.jysd.runable;

public class MyRunable implements Runnable{

	private String name;
	public MyRunable(String name){
		this.name = name;
	}
	
	public void run() {
	
		for (int i = 0; i < 5; i++) {
			System.out.println(name+":"+i);
		}
		
	}

}


package com.jysd.runable;

public class Test {

	public static void main(String[] args) {
		
		MyRunable myRunable1 = new MyRunable("张三");
		MyRunable myRunable2 = new MyRunable("李四");
			
		Thread thread1 = new Thread(myRunable1);
		Thread thread2 = new Thread(myRunable2);
		
		thread1.start();
		thread2.start();
		
		System.out.println("主线程");
	}
}


一个MyRunable的对象,就相当于一个任务,交给一个thread对象去完成,相当于一个工人
运行结果如下,





这是两次不用的运行结果,可以看出,新建的两个线程和主线程,运行结果不一致,每个线程的执行都是靠JVM的调度器来进行调度的,不分执行的前后

2.扩展Thread类的例子
package com.jysd.runable;

public class MyThread extends Thread{
	
	public MyThread(String name) {  
        super(name);  
    }  
 
    public void run() {  
        for(int i = 0;i<5;i++){  
            for(long k= 0; k <100000000;k++);  
            System.out.println(this.getName()+" :"+i);  
        }  
    }  
 
    public static void main(String[] args) {  
        Thread t1 = new MyThread("张三");  
        Thread t2 = new MyThread("李四");  
        t1.start();  
        t2.start();  
    }
	
}



结果是一样的



一些常见问题
 
1、线程的名字,一个运行中的线程总是有名字的,名字有两个来源,一个是虚拟机
自己给的名字,一个是你自己的定的名字。在没有指定线程名字的情况下,虚拟机
总会为线程指定名字,并且主线程的名字总是 mian,非主线程的名字不确定。
2、线程都可以设置名字,也可以获取线程的名字,连主线程也不例外。
  构造方法:Thread thread1 = new Thread(myRunable1, "thread1");
  set方法:thread1.setName("thread1");
3、获取当前线程的对象的方法是:Thread.currentThread();
4、在上面的代码中,只能保证:每个线程都将启动,每个线程都将运行直到完成。
一系列线程以某种顺序启动并不意味着将按该顺序执行。对于任何一组启动的线程
来说,调度程序不能保证其执行次序,持续时间也无法保证。
5、当线程目标 run()方法结束时该线程完成。
6、一旦线程启动,它就永远不能再重新启动。只有一个新的线程可以被启动,并且
只能一次。一个可运行的线程或死线程可以被重新启动。
7、线程的调度是 JVM 的一部分,在一个 CPU 的机器上上,实际上一次只能运行一个
线程。一次只有一个线程栈执行。JVM 线程调度程序决定实际运行哪个处于可运行
状态的线程。
众多可运行线程中的某一个会被选中做为当前线程。可运行线程被选择运行的顺序
是没有保障的。
8、尽管通常采用队列形式,但这是没有保障的。队列形式是指当一个线程完成“一
轮”时,它移到可运行队列的尾部等待,直到它最终排队到该队列的前端为止,它
才能被再次选中。事实上,我们把它称为可运行池而不是一个可运行队列,目的是
帮助认识线程并不都是以某种有保障的顺序排列唱呢个一个队列的事实。
9、尽管我们没有无法控制线程调度程序,但可以通过别的方式来影响线程调度的方
式。

  • 大小: 9.3 KB
  • 大小: 8.5 KB
  • 大小: 8.1 KB
分享到:
评论

相关推荐

    Java多线程编程技术

    《Java多线程编程核心技术》建议猿友们读两遍,因为其写得没有那么抽象,第一遍有些概念不是很理解,可以先跳过并记录起来,第一遍阅读的目的主要是了解整个架构。第二遍再慢慢品味,并贯穿全部是指点来思考,并将...

    java 掌握线程编程技术

    Java程序问题:先产生1万个随机数,再使用多线程对该数进行三种排序,分别记录排序运行时间

    Java毕业设计-Java多线程与线程安全实践-基于Http协议的断点续传.rar

    项目可以作为学习Java多线程编程、线程安全和Http协议的实践资源。对于有兴趣深入学习这些技术的读者来说,这是一个很好的起点。同时,项目也可以作为二次开发的基础,开发者可以在此基础上添加更多功能,如支持多种...

    Java多线程编程中ThreadLocal类的用法及深入

    早在 JDK 1.2 的时代,java.lang.ThreadLocal 就诞生了,它是为了解决多线程并发问题而设计的,只不过设计得有些难用,所以至今没有得到广泛使用。其实它还是挺有用的,不相信的话,我们一起来看看这个例子吧。 一个...

    java多线程实现下载工具

    项目是运行于window/xp上的一款c/s架构的应用软件,使用URL基于tcp/ip协议来编程实现文件定位下载,通过RandomAccessFile实现文件分割,开启多线程进行加速下载,匿名内部类开启新线程实时回传下载进度给另一个新...

    Java并发编程.xmind

    包含了java多线程基础介绍,多线程设计模式详解,juc包内对象详解,作为自己学习的记录,持续更新中

    java简易投票系统源码下载-StudyThread:学习多线程记录

    :Java多线程的核心编程技术 简介:个人学习多线程所记录; 1.Java多线程技能 1.1 进程和多线程的概念及线程的优点? 讲到多线程技术时,就不得不提及"进程"这个概念了。百度对进程的接受如下: 进程:是操作系统的...

    java并发编程代码.7z

    主要是自己学习java多线程学习的笔记记录。作为新手练手也好,作为工作三年的我,来说只是作为跳槽之前的准备,之前对于java多线程真的是一知半解,只有到这里我才发现原来是长这样的基础模型。脚踏实地的一步一步的...

    java面向对象和多线程实验

    本学期做的一个小型的文档管理系统 ,验收之后就打包贴上来,做个记录。

    个人通讯录管理 JAVA

    以下题目涉及窗体的设计、菜单设计、数据库设计、文件的读写、多线程编程等多种编程的实现,根据题目的要求自行进行编程设计。 1、个人通讯录管理 要求:编程实现个人通讯录管理(用文件存储)。主要提供如下功能: ...

    Learning:这里是我在Java学习过程中的一些代码,其中包括:MOOC课浙江大学数据结构课后习题部分实现,Java多线程编程代码实现,Spring框架工作原理初步认识

    写在前面这里记录着一个跨行菜鸟的成长路程,希望能从一只菜鸟开始,慢慢成长!:-) 如果您对我的努力...Part1 《Java多线程编程核心技术》相关代码实现Part2 《Spring3.x企业应用开发实战》相关代码实现至第6章Part3

    Java数据库编程宝典3

    4.9.3 多线程 4.10 批更新 4.11 ResultSet 4.12 可滚动的ResultSet 4.12.1 创建可滚动的ResultSet 4.12.2 游标控制 4.12.3 将游标移动到指定行 4.12.4 获得游标位置 4.13 可更新的ResultSet 4.13.1 更新...

    学习Java过程中记录的一些代码

    学习Java过程中记录的一些代码!Stream和日期的使用、 IO流、数据集合、多线程使用、并发编程、23种设计模式示例代码、常用的工具类

    Java毕业设计-Java聊天室程序(java).rar

    该程序可以作为Java毕业设计项目,为学生提供了一个实践Java网络编程和多线程技术的机会。本资源介绍将围绕该项目的功能、特点和可定制性进行简要阐述。 ### 功能 1. **用户注册与登录**:用户可以注册并登录到...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Java开发技术大全(500个源代码).

    ThreadImRunnable.java 继承Runnable接口实现多线程 mulThread.java 创建多个线程对象的类 demoJoin.java 演示使用join()以确保主线程最后结束 clicker.java 一个计数用的线程类 demoPri.java 调用上面这个类...

    毕业设计&课设-一个酒店管理系统,使用Java中的面向对象编程、多线程和文件处理技术,记录客人的….zip

    毕业设计、课程设计源码文件,已经过测试可以直接使用。毕业设计、课程设计源码文件,已经过测试可以直接使用。毕业设计、课程设计源码文件,已经过测试可以直接使用。毕业设计、课程设计源码文件,已经过测试可以...

    UDP+阻塞队列+多线程

    练习 Java 多线程编程技术。 练习实现网络并发服务的编程技术。 学习如何实现多线程间的相互同步和相互协作。 理解什么是线程安全。 二. 设计要求 功能概述:实现一个支持并发服务的网络运算服务器程序。该服务器...

    java编写的聊天程序

    java编写的聊天程序, 可以用来研究java的网络编程

    基于socket的多线程QQ聊天系统(代码+问题分析+解决方案)

    编写简单的多线程 web服务器 实现过程: 该实验我做的是一个聊天系统,实现的功能是: 服务端可以任意指定一个端口号建立服务器,等待的客户的连接,若有客户连接上,则有相应的提示,断开连接也有相应的提示,此外...

Global site tag (gtag.js) - Google Analytics