Java多线程——线程实现的三种方式

线程的三种创建方式

1.继承Thread类

例子1
// 创建方式一:继承Thread类,重写run()方法  调用start开启线程
public class TestThread01 extends  Thread{
	@Override
	public void run() {
		for (int i = 0; i < 20; i++) {
			System.out.println("我在看代码"+i);
		}
	}

	public static void main(String[] args) {
		//main线程  主线程

		//创建一个线程对象
		TestThread01 testThread01 = new TestThread01();
		//调用start开启线程
		testThread01.start();

		for (int i = 0; i < 2000; i++) {
			System.out.println("我在学习多线程"+i);
		}
	}
}

调用start()线程之间交替执行
在这里插入图片描述

调用run()和start()的区别
在这里插入图片描述

例子2//实现多线程同步下载图片
public class TestThread02 extends Thread{
	private String url;
	private String name;

	public TestThread02(String url,String name){
		this.url = url;
		this.name = name;
	}

	//下载图片线程的执行体
	@Override
	public void run() {
		TestThread02 t1 = new TestThread02("https://t7.baidu.com/it/u=4240641596,3235181048&fm=193&f=GIF", "1.jpg");
		TestThread02 t2 = new TestThread02("https://t7.baidu.com/it/u=1951548898,3927145&fm=193&f=GIF", "2.jpg");
		TestThread02 t3 = new TestThread02("https://t7.baidu.com/it/u=1831997705,836992814&fm=193&f=GIF", "3.jpg");
		t1.start();
		t2.start();
		t3.start();
	}
}

class WebDownLoader{
	public void downloader(String url,String name){
		try {
			FileUtils.copyURLToFile(new URL(url),new File(name));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

在这里插入图片描述

2.实现Runnable接口

//创建线程方式二:实现runnable接口,重写run方法
public class TestThread03 implements Runnable {
	@Override
	public void run() {
		for (int i = 0; i < 20; i++) {
			System.out.println("我在看代码"+i);
		}
	}
	public static void main(String[] args) {
		//main线程  主线程

		//创建runnable接口的实现类对象
		TestThread03 testThread03 = new TestThread03();
		//创建线程对象,通过线程对象来开启线程,代理
		Thread thread = new Thread(testThread03);
		thread.start();

		for (int i = 0; i < 100; i++) {
			System.out.println("我在学习多线程"+i);
		}
	}
}

在这里插入图片描述
在这里插入图片描述

多个线程同时操作同一个对象 买火车票的例子

//发现问题:多个线程操作同一个资源的情况下线程不安全,数据紊乱, 不同的人可以拿到同一张票(看打印结果)
public class TestThread04 implements Runnable{
	private int ticketNums = 10;

	@Override
	public void run() {
		while (true){
			if (ticketNums <= 0){
				break;
			}
			try {
				Thread.sleep(200);//模拟延时
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"-->拿到了第"+ticketNums--+"票");
		}
	}

	public static void main(String[] args) {
		TestThread04 testThread04 = new TestThread04();
		new Thread(testThread04,"小明").start();
		new Thread(testThread04,"老师").start();
		new Thread(testThread04,"黄牛党").start();
	}
}

在这里插入图片描述

上述线程存在不安全性,想要线程安全请看另一篇博客 :线程同步安全

3.实现Callable接口

/线程创建方式三:实现callable接口
	//可以定义返回值
	//可以抛出异常
public class TestThread05 implements Callable<Boolean> {
	private String url;
	private String name;

	public TestThread05(String url,String name){
		this.url = url;
		this.name = name;
	}

	//下载图片线程的执行体
	@Override
	public Boolean call() throws Exception {
		WebDownLoader webDownLoader = new WebDownLoader();
		webDownLoader.downloader(url,name);
		System.out.println("下载了文件名为:"+name);
		return true;
	}

	public static void main(String[] args) throws ExecutionException, InterruptedException {
		TestThread05 t1 = new TestThread05("https://t7.baidu.com/it/u=4240641596,3235181048&fm=193&f=GIF", "1.jpg");
		TestThread05 t2 = new TestThread05("https://t7.baidu.com/it/u=1951548898,3927145&fm=193&f=GIF", "2.jpg");
		TestThread05 t3 = new TestThread05("https://t7.baidu.com/it/u=1831997705,836992814&fm=193&f=GIF", "3.jpg");

		//创建执行服务
		ExecutorService executorService = Executors.newFixedThreadPool(3);

		//提交执行
		Future<Boolean> r1 = executorService.submit(t1);
		Future<Boolean> r2 = executorService.submit(t2);
		Future<Boolean> r3 = executorService.submit(t3);

		//获取结果
		Boolean rs1 = r1.get();
		Boolean rs2 = r2.get();
		Boolean rs3 = r3.get();
		System.out.println(rs1);
		System.out.println(rs2);
		System.out.println(rs3);

		//关闭服务
		executorService.shutdownNow();
	}
}

注意:线程开启不一定立即执行,由CPU调度执行

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android实现多线程几种方式有以下几种方法。首先,可以使用Java的Thread类来创建和管理线程。这种方式需要手动创建线程对象,并在run()方法中编写线程的逻辑。其次,可以使用Java的Runnable接口来实现多线程。这种方式需要创建一个实现了Runnable接口的类,并将其作为参数传递给Thread类的构造函数。然后,可以使用Handler类来实现多线程。通过Handler的post()或postDelayed()方法,可以将任务添加到主线程的消息队列中,从而在主线程中执行异步操作。此外,还可以使用AsyncTask类来实现多线程。AsyncTask是Android提供的一个封装好的线程池,可以方便地在后台执行耗时操作,并在主线程中更新UI。通过重写AsyncTask的doInBackground()方法来执行耗时操作,并通过onPostExecute()方法来更新UI。需要注意的是,AsyncTask必须在主线程中创建实例,并且execute()方法也必须在主线程中调用。另外,Android 3.0之后,可以使用executeOnExecutor()方法实现并发执行多个AsyncTask任务。总结起来,Android实现多线程几种方式包括使用Thread类、Runnable接口、Handler类和AsyncTask类。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [Android——多线程的多种实现方式](https://blog.csdn.net/abliudede/article/details/104891324)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Android开发中四种常用的多线程实现方式](https://blog.csdn.net/star_nwe/article/details/130140238)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灬终极斗士

您的关注就是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值