Java学习笔记21(线程)

创建线程的方式

继承Thread类

  1. 定义子类继承Thread类。
  2. 子类中重写Thread类中的run方法。
  3. 创建Thread子类对象,即创建了线程对象。
  4. 调用线程对象start方法:启动线程,调用run方法。
    run(),想要开启多线程中运行代码逻辑,就写到run()方法里面。
    start()用来启动线程,本质上是从run开始的。

TestThread,java

/**
 * 实现多线程
 * @author jkjkjk
 *
 */
public class TestThread extends Thread {
	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("run了");
		for(int i = 0; i<5;i++) {
			System.out.println("runxxxx"+i);
		}
	}

}

Test.java

public class Test {
	public static void main(String[] args) {
		Thread t0 = new TestThread();//多态
		t0.start();//启动线程,开始运行run里面的东西
		System.out.println("-------------1");
		System.out.println("-------------2");
		System.out.println("-------------3");
	}

}

运行结果:

-------------1
-------------2
run了
-------------3
runxxxx0
runxxxx1
runxxxx2
runxxxx3
runxxxx4

/**
* 多次运行这个main方法之后
* 我们发现main方法中打印的3行与开启线程运行run方法中的打印语句是混合起来
* 而且main方法中的打印与run方法中打印语句顺序是不固定的
* 为什么呢?
* main执行t0.start()方法开启多线程之后,就相当于在main方法之外开启一个支流
* 这个个时候t0.start()的之后的main方法的其他代码的运行就与run方法运行无关了
* 以当前代码为例
* t0.start()的之后的main方法的其他代码与run方法的代码并行运行
* 就像两条河流一样,各走各的
* 那么控制台输出的结果就是两条并行程序的运行结果总和,这个结果需要拆开成两部分看
* 就可以看到,各自是保持自己输出顺序
* 这个就是多线程的异步,这个异步相对于执行t0.start()的主程序来说的
* 简单来说开启了线程之后run方法中运行的代码主程序中t0.start()之后的程序是并行执行的,没先后关系,这个叫异步
*/

实现Runnable接口

1)定义子类,实现Runnable接口。
2)子类中重写Runnable接口中的run方法。
3)通过Thread类含参构造器创建线程对象。
4)将Runnable接口的子类对象作为实际参数传递给
Thread类的构造方法中。
5)调用Thread类的start方法:开启线程,调用
Runnable子类接口的run方法。

TestRunnable.java

public class TestRunnable implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println(Thread.currentThread().getName() + "接口里面的run---");
	}
	

}

Test1.java

public class Test1 {
	public static void main(String[] args) {
		
//		Thread t = new Thread(new TestRunnable());
//		t.start();
		
		Thread t1 = new Thread(new TestRunnable(), "t-1");//匿名对象
		t1.start();
		Thread t2 = new Thread(new TestRunnable(), "t-2");//
		t2.start();
		//和一种一样
		Runnable r = new TestRunnable();
		Thread t3 = new Thread(r, "t-3");//通过Thread类含参构造器创建线程对象
		t3.start();


		
		System.out.println("-------------1");
		System.out.println("-------------2");
		System.out.println("-------------3");
	}

}

继承Thread: 线程代码存放Thread子类run方法中。重写run方法
实现Runnable:线程代码存在接口的子类的run方法。实现run方法

在这里插入图片描述

避免了单继承的局限性
多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源

多线程程序的优点

提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
提高计算机系统CPU的利用率
改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改

Thread类的有关方法(1)

void start(): 启动线程,并执行对象的run()方法
run(): 线程在被调度时执行的操作
String getName(): 返回线程的名称
void setName(String name):设置该线程名称
static currentThread(): 返回当前线程
t0.setName(“线程t-0”);//设置线程的名称
t1.setName(“线程t-1”);//设置线程的名称

线程的生命周期:

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值