1,创建线程,有两种方法
/**
*
* 项目名称:ch07
* 类名称:TestThread
* 类描述:
* 创建人:Administrator
* 创建时间:2010-9-9 上午09:02:40
* 修改人:Administrator
* 修改时间:2010-9-9 上午09:02:40
* 修改备注:
* @version
*
*/
package firstthread;
public class TestThread {
public static void main(String[] args){
//创建线程两种方式
//方式1,重载run方法,new Thread()未指定线程名称,由虚拟机指定,一般是Thread-序号
System.out.println("当前线程名称,优先级 "+Thread.currentThread().getName()+Thread.currentThread().getPriority());
Thread t1 = new Thread(){
public void run(){
System.out.println("线程1");
}
};
//方式2,新建runnable,实现线程体
Runnable r = new Runnable(){
@Override
public void run() {
System.out.println("线程2");
}
};
Thread t2 = new Thread(r);
// 启动线程,主线程会继续运行下面,而不会等待子线程
t2.setPriority(10); //设置优先级最高,最先运行
t1.start();
t2.start();
System.out.println("线程1 id name "+t1.getId()+t1.getName());//Thread-0
System.out.println("线程2 id name"+t2.getId()+t2.getName());//Thread-1
System.out.println("线程1 优先级"+t2.getPriority()); //优先级为1-10,默认为5
System.out.println("线程1 所属的 线程组 "+t1.getThreadGroup().getName()); //main
System.out.println("线程组main的活动线程数"+Thread.currentThread().getThreadGroup().activeCount());
//线程组main的活动线程数2
}
}
2,一般不建议使用上面的方法创建线程,而是单独建立一个继承Thread或实现Runnable接口的线程类
利用Thread
package extendsThread;
public class MyMultiThread extends Thread
{
private int no;
public MyMultiThread(int no)
{
this.no=no;
}
public void run()
{
for(int i=0;i<5;i++)
System.out.println("\t<"+i+">Hi!我是线程"+no+"!");
System.out.println("\t线程"+no+"向你说再见...");
}
}
package extendsThread;
public class UseThread
{
public static void main(String args[])
{
MyMultiThread[] aThreadArray=new MyMultiThread[3];
System.out.println("使用Thread的多线程程序:\n");
for(int i=0;i<3;i++)
{
aThreadArray[i]=new MyMultiThread(i);
}
for(int i=0;i<3;i++)
aThreadArray[i].start();
WhileLoop:
while(true)
{
for(int i=0;i<3;i++)
if(aThreadArray[i].isAlive())
continue WhileLoop;
break;
}
System.out.println("\t我是main()!Bye bye...");
}
}
利用Runnable
package runnable;
public class MyMultiThreadClass implements Runnable
{
private int no;
public MyMultiThreadClass(int no)
{
this.no=no;
}
public void run()
{
for(int i=0;i<5;i++)
System.out.println("\t<"+i+">Hi!我是线程"+no+"!");
System.out.println("\t线程"+no+"向你说再见...");
}
}
package runnable;
public class UseRunnable
{
public static void main(String args[])
{
MyMultiThreadClass[] aMTCArray=new MyMultiThreadClass[3]; //runnbale的实例
Thread[] aThreadArray=new Thread[3];
System.out.println("使用接口Runnable的多线程程序:\n");
for(int i=0;i<3;i++)
{
aMTCArray[i]=new MyMultiThreadClass(i);
aThreadArray[i]=new Thread(aMTCArray[i]); //多实例,多线程,不存在安全问题
// 如果一个实例构造多个线程,就存在变量安全问题
}
for(int i=0;i<3;i++)
aThreadArray[i].start();
WhileLoop:
while(true)
{
for(int i=0;i<3;i++)
if(aThreadArray[i].isAlive())
continue WhileLoop;
break;
}
System.out.println("\t我是main()!Bye bye...");
}
}
3,线程组
package threadgroup;
public class TestThreadGroup
{
public static void main(String[] args)
{
ThreadGroup tg1=new ThreadGroup("thread_group1");
Thread thread1=new Thread(tg1,"thread1");
Thread thread2=new Thread(tg1,"thread2");//group,name
tg1.list(); //打印线程组信息
tg1.setDaemon(true);
System.out.println(tg1.getName()+"的父线程组是:"+tg1.getParent().getName());
thread1.start();
Thread[] threadArray1=new Thread[tg1.activeCount()];
tg1.enumerate(threadArray1,false); //将线程组中活动线程放入数组
System.out.println(tg1.getName()+"的活动线程有:"+threadArray1.length);
ThreadGroup[] threadGroupArray1=new ThreadGroup[tg1.activeGroupCount()];
tg1.enumerate(threadGroupArray1,false);
System.out.println(tg1.getName()+"的活动线程组有:"+threadGroupArray1.length);
ThreadGroup tg2=new ThreadGroup(tg1,"thread_group2");
Thread thread3=new Thread(tg2,"thread3");
Thread thread4=new Thread(tg2,"thread4");
tg2.list();
tg2.setDaemon(true);
System.out.println(tg2.getName()+"的父线程组是:"+tg2.getParent().getName());
Thread[] threadArray2=new Thread[tg2.activeCount()];
tg2.enumerate(threadArray2,false);
System.out.println(tg2.getName()+"的活动线程有:"+threadArray2.length);
ThreadGroup[] threadGroupArray2=new ThreadGroup[tg2.activeGroupCount()];
tg2.enumerate(threadGroupArray2,false);
System.out.println(tg2.getName()+"的活动线程组有:"+threadGroupArray2.length);
}
}
4,守护线程
package daemonThread;
public class TestDaemon {
//守护线程测试
public static void main(String[] args) {
Thread parent = new Thread(){
public void run(){
System.out.println("praent starts....");
//创建子线程
Thread child = new Thread(){
public void run(){
System.out.println("child starts....");
while(true){
System.out.println("child runs...");
}
}
};
child.setDaemon(true);//false子线程不是守护线程,即父线程终止时,子线程会继续运行
child.start();
}
};
parent.start(); //父线程先运行
}
}
所有chapter7的源码见附件
分享到:
相关推荐
本章“jdk6.0从入门到精通-----chapter8并发多线程(1)”着重讲解了Java 6中关于多线程的基本知识和实践技巧。通过源码下载,读者可以更直观地理解多线程的实现方式。 首先,我们要理解什么是多线程。在单线程环境...
《JDK 6.0从入门到精通——Chapter 17 动态编程》 在Java编程领域,JDK 6.0版本引入了许多新特性,其中动态编程是提升开发效率和灵活性的重要方面。本章将深入探讨动态编程的概念、用途以及如何在JDK 6.0中利用这些...
在Java编程领域,JDK(Java Development Kit)是开发和运行Java应用程序的...总的来说,"JDK6.0从入门到精通-----chapter5网络编程 新I/O"是一个极好的学习资源,无论你是初学者还是有经验的开发者,都能从中获益良多。
标题中的“jdk6.0从入门到精通-----chapter18与动态语言结合”指的是Java开发工具包(JDK)6.0版本中的一个章节,主要探讨了如何将Java与动态编程语言集成。在Java 6中,引入了一个重要的特性,即Java平台标准版6...
标题 "(源码下载)jdk6.0从入门到精通-----chapter2--输入输出,克隆对象" 提供了我们要探讨的主题,即Java中的输入输出流(I/O Stream)和对象克隆。在这个章节中,我们将深入理解这两个关键概念。 **输入输出流...
在Java编程语言中,JDK(Java Development Kit)是核心组件,它包含了开发和运行Java应用程序所需的工具和...同时,随着Java版本的更新,如JDK 7和8引入了更多的文件操作改进,开发者也需要持续学习和掌握最新的技术。
在Java编程领域,JDK6.0是一个重要的版本,它为开发者提供了丰富的特性和改进。本章我们将深入探讨“反射机制”以及如何结合Spring AOP(面向切面编程)进行应用。反射是Java中的一种强大工具,允许程序在运行时检查...
微信开发平台开发工具 JDK jdk 6.0 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008
jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-...
java6.0文档chm版,分成三部分,分别为JDK6.0+中文文档-lytim24.part1.rar、JDK6.0+中文文档-lytim24.part2.rar、JDK6.0+中文文档-lytim24.part3.rar
开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8...
- 首先,从官方或可信渠道下载JDK 6.0的安装程序。 - 运行安装程序,按照提示完成安装过程。 - 配置环境变量,如JAVA_HOME指向JDK安装目录,PATH添加bin子目录,确保系统能够找到Java命令。 - 检验安装是否成功,...
这个是安装开发工具java jdk 有很多用途
java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...
tar -zxvf jdk-7u80-linux-x64.tar.gz ``` 这会创建一个名为`jdk1.7.0_80`的目录,其中包含了JDK的所有文件。 ##### 4.3 设置环境变量 为了让操作系统能够找到JDK,需要将JDK的路径添加到系统的环境变量中。可以...
JDK版本:JDK-7u80-windows-x64版本,即为jdk1.7,此版本会自动安装JRE(Java的一个运行环境).
jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-...
【标题】"jdk-7u80-windows-x64.exe" 指的是Java Development Kit (JDK) 的第7个版本更新80的64位Windows安装程序。JDK是Oracle公司提供的一个用于开发和运行Java应用程序的核心工具集。 【描述】"jdk-7u80-windows...
在Linux系统上,JDK通常以压缩包的形式分发,例如"jdk-7u80-linux-x64.tar.gz"和"ORACLE JDK1.7 linux x64.zip"。 首先,我们来看"jdk-7u80-linux-x64.tar.gz"文件。这是一个gzip压缩过的tar归档文件,"tar"是用于...