java多线程学习(二)——线程的创建

一、java创建线程的两个方法

1、从java.lang.Thread类派生出一个新的线程类,重载它的run()方法

2、实现Runnable接口,重载Runnable接口中的run()方法。

使用Thread类来创建线程和创建普通类的对象的操作是一样的,线程是Thread类或者其子类的实例对象。

二、java提供的两种创建线程的区别

java中类是单继承的,当定义一个新的线程类的时候,它只能扩展一个外部类,那么当创建的线程是继承自Thread类来实现的,那么此线程类无法再扩展其他类,无法实现复杂的功能。此时,自定义的线程类如果要扩展其他类,那么可以实现Runnable接口来实现线程类的功能,同时又可以扩展其他外部类,避免单继承带来的局限性。

同时,实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享。

三、线程的创建

(1)由Thread类派生

由Thread派生出来的线程类,直接new即可。

例如:

package com.thread.demo;

public class JavaThreadDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MutliThread m1 = new MutliThread("window 1");
		MutliThread m2 = new MutliThread("window 2");
		MutliThread m3 = new MutliThread("window 3");
		m1.start();
		m2.start();
		m3.start();
	}

}

class MutliThread extends Thread {
	private int ticket = 100;

	MutliThread(String name) {
		super(name);
	}

	public void run() {
		while(ticket > 0) {
			ticket--;
			System.out.println(ticket +" is saled by " + Thread.currentThread().getName());
		}
	}
}

上面的例子中由Thread类派生出的MutliThread类,在main()方法中new了三个线程类,并调用线程类的start方法来运行线程,三个线程并发的执行。有输出结果可以看出。

(2)实现Runnable接口

创建的类如果实现了Runnable接口,则需要使用Thread的构造方法来创建线程。

例如:

package com.thread.demo;

public class JavaThreadDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		TestRunnable test1 = new TestRunnable("张三");
		TestRunnable test2 = new TestRunnable("李四");

		Thread t1 = new Thread(test1);
		Thread t2 = new Thread(test2);

		t1.start();
		t2.start();

	}

}

class TestRunnable implements Runnable {
	private String name;

	TestRunnable(String name) {
		this.name = name;
	}

	@Override
	public void run() {
		for(int i = 0; i < 5; i++) {
			try {
				Thread.sleep(50);//模拟耗时操作
				System.out.println(name + ":" + i);

			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}
}

上面的例子中TestRunnable实现了Runnable接口,并重载了其中的run()方法,在run()方法中模拟了耗时操作。

在main()方法中,首先创建了两个TestRunnable的实例,接着调用Thread的构造方法来创建了两个线程类,最后调用线程的start()方法来运行线程。这两个线程并行执行,可以看到输出结果为

每次的输出结果都不同,因为线程的运行是不确定的,随机器和运行的状态而变化。

四、线程中需要注意的一些小问题:

1、每个线程都有自己的名字,如果不明确指定名字,那么线程的名字由虚拟机自己分配。主线程的名字总是main,非主线程的名字不确定,视虚拟机分配的名字而定。所有的线程(包括主线程main)的名字都可以设置和获取它的名字。

2、获取当前线程的对象的方法:Thread.currentThread();

3、线程的执行并不是按某种顺序而执行的,对于任何一组启动的线程来说,调度程序不能保证其执行顺序,持续时间也无法确定,上面的线程例子中,每次运行的结果都不同,正好可以说明这一点。

4、线程的run()方法执行完毕,则此线程结束。一个可运行的线程或者死线程可以被重新启动。

5、线程的调度是JVM上的一部分,在一个CPU的机器上,实际上一次只能运行一个线程,一次只有一个线程栈执行。JVM线程调度程序决定实际运行那个处于可运行状态的线程。可运行状态线程的被选择顺序是不确定的。

时间: 2024-08-07 16:46:47

java多线程学习(二)——线程的创建的相关文章

Java多线程学习之线程的状态及中断线程

线程的状态 新建(new):当线程被创建时,它只会短时间处于这种状态.它已经分配了必要的系统资源,完成了初始化.之后线程调度器将把这个线程转变为可运行或者阻塞状态: 就绪(Runnable):在这种状态下,只要调度器分配时间片给线程,线程就可以运行了: 阻塞(Blocked):有某个条件阻止线程运行,调度器将忽略阻塞状态的线程,不会分配时间片给它,直到线程进入就绪状态,它才有可能执行: 死亡(Dead):处于死亡或者终结状态的线程将不再是可调度的,并且也不会被分配到时间片.任务死亡的方式通常是从

Java多线程学习之线程的同步

多线程编程要解决的一个基本问题是:共享资源的竞争.而基本上使用并发模式在解决这个问题都采用序列化访问共享资源的方法.基本原理就是当共享资源被一个任务使用时,在其上加锁,其他任务在资源被解锁之前,无法访问它.在任务对其解锁后,另一个任务就可以锁定并使用它.下面看看Java支持的线程同步机制. 1.synchronized关键字 synchronized关键字即可应用于对象相关的同步,也可用于类层次的同步(static属性): 对象上应用synchronized可以实现对象方法的同步和代码块的同步.

Java多线程学习之线程的取消与中断机制

任务和线程的启动很容易.在大多数情况下我们都会让他们运行直到结束,或是让他们自行停止.但是,有时我们希望提前结束任务或是线程,可能是因为用户请求取消,或是线程在规定时间内没有结束,或是出现了一些问题迫使线程要提前结束. 强制一个线程或是服务立即停止,可能会造成共享数据状态不一致的问题,比如,两个线程正对一个共享数据进行操作,然后被突然杀死,这样会对数据造成不确定性的影响.Java中没有提供任何机制来安全的终止线程,但它提供了中断,这种协作机制,“提醒”线程可以自己结束自己线程.这种机制提供了更好

java多线程学习(四)——线程的交互

线程交互中用到的三个基本函数: void notify():唤醒在此对象监视器上等待的单个线程. void notifyAll():唤醒在此对象监视器上等待的所有线程. void wait();导致当前的线程等待,直到其他线程调用此对象的notify()或者notifyAll()方法. void wait(long timeout);wait()的重载版本,同样导致当前线程等待,直到其他线程调用此对象的notify()或者notifyAll()方法,或者等待超过指定的时间后不再等待. void

java基础学习总结——线程(二)

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! java基础学习总结——线程(二) 一.线程的优先级别 线程优先级别的使用范例: 1 package cn.galc.test; 2 3 public class TestThread6 { 4 public static void main(String args[]) { 5 MyThread4 t4 = new MyThread4(); 6 MyThread5 t5 = new MyThread5(); 7 Thread t1

Java多线程(二)、线程的生命周期和状态控制(转)

Java多线程(二).线程的生命周期和状态控制 分类: javaSE综合知识点 2012-09-10 16:11 15937人阅读 评论(3) 收藏 举报 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadSt

java基础学习总结——线程(一)

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! java基础学习总结——线程(一) 一.线程的基本概念 线程理解:线程是一个程序里面不同的执行路径 每一个分支都叫做一个线程,main()叫做主分支,也叫主线程. 程只是一个静态的概念,机器上的一个.class文件,机器上的一个.exe文件,这个叫做一个 进程.程序的执行过程都是这样的:首先把程序的代码放到内存的代码区里面,代码放到代码区后并没有马上开始执行,但这时候说明了一个进程准备开始,进程已 经产生了,但还没有开始执行,这就是

[转]Java多线程学习(总结很详细!!!)

Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的线程函数用法.概述等.首先让我们来了解下在操作系统中进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,

java多线程学习(2)

1)Callable和Future Runnable封装一个异步运行的任务:可以当成一个没有任何参数和返回值的异步方法,Callable和 Runnable类似,但是它有返回值和参数. Callable接口是一个参数化的类型,只有一个方法call. 1 public interface Callable<V> 2 3 { 4 5 V call()throws Exception; 6 7 } 类型参数v是指返回值的类型,例如Callable<Integer>代表最终返回一个Inte

java多线程学习(1)

1)多线程与多进程的区别 多线程和多进程有什么区别呢?本质的区别在于每个进程有它自己的变量的完备集,线程则共享相同的数据. 对程序来说,共享的变量会使得线程之间的通信比进程间的通信更加有效和简单:同时,线程相对于进程来说,更加的“轻量级”, 线程的创建和销毁要比 进程的 开销要小的多. 2)多线程程序的构造 多线程的构造通常有两种方法, 第一种方法是,构建一个Thread的子类,并重写它的run()方法: 1 class MyThread extends Thread 2 { 3 4 publi