标签:调用 创建线程 有一个 .com 连续 情况 xtend 过程 demo
进程和线程: 一个程序运行后至少有一个进程,一个进程里面可以包含多个线程,但是至少要包含一个线程。
线程的创建和启动:
方式1:继承Thread类创建线程类,步骤
1.定义Thread类的子类,重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此run()方法也被称为线程执行体
2.创建Thread子类的实例,即创建了线程对象
3.调用线程对象的start()方法来启动该线程
public class Thread1 extends Thread{
private int i;
@Override
public void run() {
for( ; i < 100 ; i++) {
System.out.println(getName() + "-----" + i);
}
}
public static void main(String[] args) {
for(int i = 0; i<100; i++) {
System.out.println(Thread.currentThread().getName() + " -- " + i);
if(i == 20) {
new Thread1().start();
new Thread1().start();
}
}
}
}
注意:main()方法的方法体就是主线程的线程体
Demo中i为Thread1的实例变量,但因为程序每次创建线程对象都需要创建一个Thread1对象,两个线程是不会共享该实例变量的 , 强调这一点,是想和方式2做比较,加深理解。
方式2:实现Runnable接口创建线程类,步骤
1.定义Runnable接口的实现类,重写该类的run()方法,run()方法为该线程的线程执行体
2.创建Runnable实现类的实例,并以此实例作为Thread的Target来创建Thread对象,该Thread对象才是真正的线程对象
3.调用线程对象的start()方法来启动该线程
public class Thread2 implements Runnable{ private int i; @Override public void run() { for( ; i < 100; i ++) { // System.out.println(Thread.currentThread().getName() + " -- " + i); } } public static void main(String[] args) { for(int i = 0 ; i < 100 ; i++) { System.out.println(Thread.currentThread().getName() + " -- " + i); if(i == 20) { Thread2 th = new Thread2(); new Thread(th , "线程1").start(); new Thread(th , "线程2").start(); } } } }
注意:调用getName的方式必须是通过Thread.currentThread.getName(),因为Runnable对象只能作为线程对象的target
运行demo可以看到,两个子线程的i变量是连续的,也就是采用runnale接口方式创建的多个线程可以共享线程类的实例变量,程序创建的Runnable对象只是线程的target,而多个线程,可以共享一个target,所以,多个线程可以共享一个线程类(实际上应该是线程的target类)的实例变量。
方式3:使用Callable 和 Future 创建线程:
实际运用过程中使用方式2和方式3比较多 , 1. 单继承,多实现 , 2. 多个线程可以共享一个target对象,所以非常适合多个线程来出来同一份资源得情况
标签:调用 创建线程 有一个 .com 连续 情况 xtend 过程 demo
原文地址:https://www.cnblogs.com/Uzai/p/9663359.html