java 多线程的创建
什么是进程,什么是线程就不多说了,直接上简单易懂的代码,最后进行说明。
两种方法: 继承Thread 和 实现Runnable 接口
说白了启用线程就是调用对象中的run方法,即:要实现不同的线程功能,重写run方法即可
方法一:
//package xiancheng;
public class ThreadDemo {
public static void main(String[] args) {
Thread t = new myThread(); //创建对象,多态的形式
Thread t2 = new myThread();
t2.start(); //把程序变为待续状态(准备激活线程)
t.start();
}
}
class myThread extends Thread{
/**
* 重写run的方法
*/
@Override
public void run() {
for (int i=0;i<20;i++) {
// 获得线程的名字
System.out.println(Thread.currentThread().getName()+" --"+i);
// 睡眠500毫秒 ,try carth 是必须的
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
结果: 两个线程 哪个最先执行不确定
方法二:
//package xiancheng;
public class ThreadDemo {
public static void main(String[] args) {
//Thread t = new myThread(); //创建对象,多态的形式
//Thread t2 = new myThread();
//t2.start();
//t.start();
myThread2 mt2 = new myThread2();
Thread t1 = new Thread(mt2);
Thread t2 = new Thread(mt2);
t2.start();
t1.start();
}
}
class myThread2 implements Runnable{
/**
* 重写run的方法
*/
@Override
public void run() {
for (int i=0;i<20;i++) {
// 获得线程的名字
System.out.println(Thread.currentThread().getName()+" --"+i);
// 睡眠500毫秒 ,try carth 是必须的
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
结果一样,两种代码的分析:
两个类的内容一模一样,只是一个类继承了Thread类,一个类实现了Runnable接口。
在启用线程上,第一个方法直接创建Thread对象,第二方法把类的对象作为参数传入到Thread 的对象中,两种写法结果一样,,,但是推荐用第二种方法:
- 如果需要继承Thread的类就不能继承其他类了,接口可以多实现
- 第二个方法作为参数传入,可以看成是一个任务,在多线程的调用中非常方便,可以任意放入到任意的线程中。
扩展:
Thread 类中的一些常用方法,静态的方法可以用类名调用
Modifier and Type | Method | Description |
---|---|---|
static int | activeCount() | 返回当前线程的thread group及其子组中活动线程数的估计。 |
static Thread | currentThread() | 返回对当前正在执行的线程对象的引用。 |
String | getName() | 返回此线程的名称。 |
int | getPriority() | 返回此线程的优先级。 |
Thread.State | getState() | 返回此线程的状态。 |
ThreadGroup | getThreadGroup() | 返回此线程所属的线程组。 |
void | interrupt() | 中断这个线程(抛出一个异常)。 |
static boolean | interrupted() | 测试当前线程是否中断。 |
boolean | isAlive() | 测试这个线程是否活着。 |
boolean | isDaemon() | 测试这个线程是否是守护线程。 |
boolean | isInterrupted() | 测试这个线程是否被中断。 |
void | join() | 等待这个线程死亡(重点是等待,)。 |
void | join(long millis) | 等待这个线程等待最多 millis毫秒。 |
void | join(long millis, int nanos) | 等待最多 millis毫秒加上 nanos纳秒这个线程死亡。 |
void | run() | 如果这个线程使用单独的Runnable运行对象构造,则调用该Runnable对象的run方法; 否则,此方法不执行任何操作并返回。 |
void | setDaemon(boolean on) | 将此线程标记为 daemon线程或用户线程 |
void | setName(String name) | 将此线程的名称更改为等于参数 name 。 |
void | setPriority(int newPriority) | 更改此线程的优先级(相对的)。 |
static | void sleep(long millis [, int nanos]) | 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。 |
void | start() | 导致此线程开始执行; Java虚拟机调用此线程的run方法。 |
String | toString() | 返回此线程的字符串表示,包括线程的名称,优先级和线程组。 |
static void | yield() | 对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。 |