一、线程的创建
1.继承Thread类实现多线程
此方法缺点:
因为java不支持多继承,一但继承了Thread类就不能继承其他类
//继承Thread类实现多线程
public class TestThread extends Thread{
//线程的线程体
@Override
public void run() {
System.out.println(this.getName()+"线程开始");
for (int i = 0;i<20;i++){
System.out.println(this.getName()+" "+i);
}
System.out.println(this.getName()+"线程结束");
}
public static void main(String[] args) {
System.out.println("主线程开始");
TestThread t1 = new TestThread();
//启动线程
t1.start();
TestThread t2 = new TestThread();
t2.start();
System.out.println("主线程结束");
}
}
2.实现Runnable接口实现多线程
注意:
- 通过Thread类下的currentThread()方法返回当前线程对象然后再去获取当前线程的一些信息。例如通过Thread.currentThread().getName()获取线程名称
- 启动线程时要通过Thread包装使之成为真正的线程,再去调用start()方法启动。
例如:Thread t2 = new Thread(new TestThread2()); t2.start();
//通过实现Runnable接口实现多线程
public class TestThread2 implements Runnable{
//输出线程名称为:main原因:TestThread2没有被Thread所包装,所以不属于线程,只是一个普通的类,所以输出主线程名称
public TestThread2() {
System.out.println(Thread.currentThread().getName());
}
//当前线程的线程体方法
@Override
public void run() {
//通过Thread类下的currentThread()方法返回当前线程对象然后再去获取当前线程的一些信息
System.out.println(Thread.currentThread().getName()+"线程开始");
for (int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
System.out.println(Thread.currentThread().getName()+"线程结束");
}
public static void main(String[] args) {
System.out.println("主线程开始");
TestThread2 testThread2 = new TestThread2();
Thread t1 = new Thread(testThread2);//该testThread2对象被Thread包装返回线程对象
t1.start();
Thread t2 = new Thread(new TestThread2());
t2.start();
System.out.println("主线程结束");
}
}
二、线程的使用
1.终止线程
//终止线程
public class StopThread implements Runnable{
private boolean flag = true;
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" 线程开始");
int i = 0;
while (flag){
System.out.println(Thread.currentThread().getName() +" "+i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+" 线程结束");
}
public void stop(){
this.flag = false;
}
public static void main(String[] args) throws Exception{
System.out.println("主线程开始");
StopThread st = new StopThread();
Thread t1 = new Thread(st);
t1.start();
System.in.read(); //使主线程处于阻塞状态
st.stop();
System.out.println("主线程结束");
}
}
2.线程暂停_sleep方法
//线程暂停_sleep方法
public class SleepThread implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" 线程开始");
for (int i = 0;i<20;i++){
System.out.println(Thread.currentThread().getName()+ " "+i);
try {
Thread.sleep(1000); //由运行状态转为阻塞状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+" 线程结束");
}
public static void main(String[] args) {
System.out.println("主线程开始");
Thread t = new Thread(new SleepThread());
t.start();
System.out.println("主线程结束");
}
}
3.线程暂停_yield方法
//线程暂停_yield方法
public class YieldThread implements Runnable{
@Override
public void run() {
for (int i=0;i<30;i++){
if ("Thread-0".equals(Thread.currentThread().getName())){
if (i<=10){
Thread.yield();
}
}
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new YieldThread());
Thread t2 = new Thread(new YieldThread());
t1.start();
t2.start();
}
}
4.线程的联合
//通过join()方法实现线程的联合
class A implements Runnable{
@Override
public void run() {
for (int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class B implements Runnable{
@Override
public void run() {
for (int i=0;i<20;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class JoinThread {
public static void main(String[] args) {