多线程的实现方式

多线程的实现方式

1.多线程概述

进程和线程

进程:正在运行的程序,是系统进行资源分配和调用的独立单位。
每一个进程都有它自己的内存空间和系统资源。
线程:是进程中的单个顺序控制流,是一条执行路径;
一个进程如果只有一条执行路径,则称为单线程程序。
一个进程如果有多条执行路径,则称为多线程程序。

2.如何实现多线程

由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。但是,Java语言是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序。只能去调用C/C++写好的程序来实现多线程程序。而又由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西,然后提供一些类供我们使用。我们就可以实现多线程程序了。
Java提供了三种实现方式,下面我们来一一讲解。

2.1实现方式一:继承Thread类

1.自定义一个类,继承自Thread类;
​2.在这个类中重写Thread类中的run()方法;
​3.在主线中开启子线程main线程;
​3.1创建自定义线程类对象;
​3.2使用线程类对象调用run()方法还有start()方法;

首先自定义一个类MyThread,继承自Thread类。提供了一个方法run()。

public class MyThread extends Thread {

	public void run() {
		for(int x = 0 ; x < 100;x ++) {
			System.out.println(x);
		}
	}
}

定义一个测试类,创建对象“a”分别去启动线程,调用上面的方法run()。

public class Test {

	public static void main(String[] args) {
		MyThread a = new MyThread();
			
			a.start();
			a.run();
	}
}
2.2实现方式二:接口Runnable

​实现步骤:
1.自定义一个类,实现 Runnable接口 (资源类);
2.实现接口中提供的功能:public abstract void run();
3.在用户线程main中创建资源类对象,创建Thread类对象,将对象作为参数传递,分别启动线程。

public class MyRunnable implements Runnable{
	@Override
	public void run() {
		for(int x = 0 ; x < 100 ; x++) {
			//使用Thread.currentThread()--->正在运行的线程
			System.out.println(Thread.currentThread().getName()+":"+x);
		}
	}
}
public class Test {
	public static void main(String[] args) {
		//创建资源类对象
		MyRunnable my = new MyRunnable();
		//创建线程类对象
		Thread t1 = new Thread(my);
		Thread t2 = new Thread(my);
		//给线程设置一个名称
		t1.setName("简自豪");
		t2.setName("明");
		//分别启动线程
		t1.start();
		t2.start();
	}
}
2.3实现方式三:线程池

实现步骤:
此处我们需要借助Executors工具类提供的newFiexdThreadPool(int nThreads)方法;
1.创建线程池对象: S pool = Executors.newFiexdThreadPool(int nThreads){};
2.提交异步任务 submit(Callable call);
​实现Callable:接口 ;
3.关闭资源;

import java.util.concurrent.Callable;
public class MyCallable implements Callable {
	
	@Override
	public Object call() throws Exception {
		for(int x = 0 ; x < 100 ; x ++) {
			System.out.println(Thread.currentThread().getName()+":"+x);
		}
		return null;
	}
}
public class ExecutorServiceDemo {
	public static void main(String[] args) {
		//1)创建线程池对象
		ExecutorService pool = Executors.newFixedThreadPool(2) ;
		//2)提交异步任务
		pool.submit(new MyCallable()) ;
		pool.submit(new MyCallable()) ;
		//3)关闭资源
		pool.shutdown();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值