线程的实现方式

  • 线程的基本概念:

线程是指程序执行的最小单元,是进程中的一个独立执行路径,能够并发执行,允许程序在同一时间执行多个任务。

单线程:

单线程就是进程中只有一个线程。单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。

多线程:

由一个以上的线程组成的程序称为多线程程序。Java中,一定是从主线程开始执行(main方法),然后在主线程的某个位置创建并启动新的线程。

  • 线程的特点:

1、并发性

2、共享性

3、轻量型

4、互相影响

  • 实现线程的多种方式:

1、继承 java.lang.Thread 类(线程子类)

实现步骤:

定义一个类并继承Thread类,在该类中重写run()方法,在主线程中创建好了Theard类的实例,调用start()方法启动线程。

代码案例如下:

public class main {
	public static void main(String[] args) {
		System.out.println("主线程开始执行");
		//创建子线程1
		Thread thread1 = new Thread("线程1"){
				public void run() {
					for (int i = 0; i < 100; i++) {
						System.out.println("[线程1]"+i);
					}
				}
		};
		thread1.start();//启动线程
		System.out.println("主线程结束执行");
	}
}

2、实现 java.lang.Runnable 接口(线程执行类)

实现步骤:

定义一个类来实现Runnable接口,实现run()方法,在主线程中创建MyRunnable的实例,并作为参数传递给Thread类的构造函数调用start()方法启动线程。

代码案例如下: 

StringBuffer buffer = new StringBuffer();
Thread t = new Thread(new Runnable() {
		@Override
		public void run() {
			// TODO Auto-generated method stub
			for(char c ='A';c<'F';c++) {
				buffer.append(c);
			}
		}
	});
    t.start();
    t.join();
    System.out.println(buffer);

3、实现 java.util.concurrent.Callable 接口,允许子线程返回结果、抛出异常

实现步骤:

定义一个类来实现Callable接口,在主线程中创建MyCallable的实例,并作为参数传递给FuturTask类的构造函数来创建一个FuturTask对象,再将FuturTask对象作为参数传递给Thread类的构造函数调用start()方法启动线程。

代码案例如下: 

StringBuffer buffer = new StringBuffer();
Thread t = new Thread(new FutureTask<String>(new Callable<String>() {
		@Override
		public String call() throws Exception {
			String[] array = {"@","$","%","&","*"};
			for (int i = 0; i < array.length; i++) {
				buffer.append(array[i]);
			}
			return buffer.toString();
		}
	}));
    t.start();
    t.join();
    System.out.println(buffer);

4、线程池

创建适合当前线程的线程池,提交多个任务给线程池,使用完线程池后进行关闭。

代码案例如下: 

public class main {
	public static void main(String[] args) {
		//固定数量(10)的线程池
		ExecutorService service = Executors.newFixedThreadPool(10);
		//不确定的线程数量
		while(true) {
			//向线程池提交一个执行任务(Runnable接口实现类对象)
			//线程池分配一个"空闲线程"执行该任务
			//如果没有空闲线程,则该任务进入“等待队列(工作队列)”
			service.execute(new Runnable() {
				
				@Override
				public void run() {
					// TODO Auto-generated method stub
					System.out.println("当前运行的线程名是"+Thread.currentThread().getName());
					try {
						Thread.sleep(1000);//休眠1000毫秒
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			});
		}
	}
}
  •  总结

以上这四种方式都可以用来创建线程,具体选择那种方法取决于应用场景。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

猿究院懒羊羊

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值