线程 之 创建(两种方法)和启动

java使用Thread类代表线程,所有的线程对象都必须是Thread 类或者子类的实例。

每个线程的任务是完成一定的任务,就是执行一段程序流。

目前有两种创建方式(第三种后续补充)
一种是继承Thread类
一种是实现Runnable接口`

一、继承Thread类
1.定义Thread子类,并重写run()方法。
run()方法内就是线程需要完成的任务,因此可以将run()方法称为线程执行体。
2.创建Thread子类的实例,也就是创建线程对象。
3.线程对象调用start()方法,启动线程。

package myclass;
//包:编译时需要:javac -d e:\java基础 FirstThread.java 在当前文件夹中显示class文件
//运行前:set classpath=e:\java基础
//运行:java myclass.FirstThread
//定义Thread子类,用来继承Thread类
class SecondThread extends Thread
{
private int i;
//调用run()方法,run()放就是线程的执行体。
public void run()
{
for( ;i<100;i++)
{
//当线程继承Thread类后,直接使用this即可或得当前线程。
//Thread类对象的getName()返回当前线程的名字。
System.out.println(this.getName() + " " + i );
}
}
}
public class FirstThread
{
public static void main(String[] args)
{
for(int x=0;x<100;x++)
{
//调用Thread类的currentThread()方法来获取当前线程
System.out.println(Thread.currentThread().getName()+ " " + x);
if(x == 20)
{
//创建子类的实例
SecondThread st = new SecondThread();
//启动线程,线程只能调用一次start()方法,否则就会发生异常。
st.start();
}
}
}
}

其中包括两个线程:
1.是程序显式创建并启动了一个线程。
会被this.getName()获取调用该方法的线程的名字。
2.main()方法的方法体代表主线程的线程执行体。
会被Thread.currentThread().getName()方法打印出来名字

注意:1.重写的run()方法可以作为一般方法来进行调用,这种调用不会出现线程。
同样run()方法也可以被重载,重载后的的run()方法也不是线程。
2.这两个循环变量不连续,表示他们没有共享数据

二、实现Runnable接口创建线程类
1.建类实现接口
2.覆盖Runnable接口中的run()方法,将要运行的代码放在run()中
3.通过Thread类建立对象
4.将Runnable接口的子类作为实参传递给Thread类的构造函数中
5.调用Thread类的start()方法开启线程。

package myclass;
class ThreadDemo implements Runnable //实现接口Runnable
{
private int i;
//覆盖接口中的run()方法,run()方法中是程序的执行体。
public void run()
{
for( ; i<100 ;i++)
{
//当线程实现Runnable后,就只能使用Thread.currentThread().getName()
//方法获取当前线程的名字。
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}

class SecondThread
{
public static void main(String[] args)
{
for(int x=0;x<100;x++)
{
System.out.println(Thread.currentThread().getName() + " " +x);
if(x == 20)
{
//创建Runnable接口的子类对象
ThreadDemo st = new ThreadDemo();
//将该子类对象作为实参传入到Thread构造函数中
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();

       }
    }
 }

}

Runnable接口可以共享同一个线程类的实例变量。

Runnable 的优缺点是:
优点:
1.线程类实现了Runnable 类还可以继承其他类。
2.在阵中情况下,可以共享同一个target对象,所以适合多个线程来处理同一份资源,从而将代码,数据,cup分开,形成较为清晰的模型,较好地体现了面对对象的思想
缺点:
如果需要访问当前线程,只能使用Thread.currentThread()方法。

Thread的优缺点:
缺点:因为继承了Thread类,所以不能再继承其他类
优点:如果需要访问当前线程,直接使用this.就行。

猜你喜欢

转载自blog.csdn.net/weixin_43247990/article/details/83386684
今日推荐