java中的多线程理解_java多线程理解及实现

其实多线程也很好理解,就好比我们坐高铁、飞机过安检一样,过安检的时候一个入口只有一个安检口,而多线程就是为安检开启了多个安检口,话不多说贴代码

线程实现的三种方式:

一、继承Thread类创建线程类

1、定义Thread子类,重写run()方法,把需要做线程操作的类容放入该方法体中。

2、创建Thread子类的实例,在实例中调用线程对象的start()启动线程方法,此方法也是代表线程数量的方法,需要启动多个线程时,只需要调用多次则以。

packagecom.thread;public class FirstThreadTest extendsThread{int i = 0;//重写run方法,run方法的方法体就是现场执行体

public voidrun(){for(;i<100;i++){

System.out.println(getName()+" "+i);

}

}public static voidmain(String[] args){for(int i = 0;i< 100;i++){

System.out.println(Thread.currentThread().getName()+" :"+i);

if(i==20){newFirstThreadTest().start();newFirstThreadTest().start();

}

}

}

}

上述代码中Thread.currentThread()方法返回当前正在执行的线程对象,getName()方法返回线程名称。

二、通过Runnable接口创建线程类,这也是常用的一种

1、定义runnable接口实现类,并重写run()方法,此方法跟继承Thread类中的run是一样的

2、创建实现类的实例,并在实例中创建Thread对象,该对象也是代表线程数量的对象,启动多个线程只需要多次调用对象的start()方法则以。

packagecom.thread;public class RunnableThreadTest implementsRunnable

{private inti;public voidrun()

{for(i = 0;i <100;i++){

System.out.println(Thread.currentThread().getName()+" "+i);

}

}public static voidmain(String[] args){for(int i = 0;i < 100;i++){

System.out.println(Thread.currentThread().getName()+" "+i);

if(i==20){

RunnableThreadTest rtt= newRunnableThreadTest();new Thread(rtt,"新线程1").start();new Thread(rtt,"新线程2").start();

}

}

}

}

三、通过线程池实现多线程,这个是做常用的也是最实用的

1、通过ExecutorService来管理线程池,并且初始化线程数量

2、定义队列来存放线程池

3、循环判断线程是否执行还是睡眠

importjava.util.Queue;importjava.util.concurrent.ConcurrentLinkedDeque;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;public classTestThread {//首先初始化ExecutorService线程池,用来管理多线程,设置线程数量

private static ExecutorService pool = Executors.newFixedThreadPool(50);//定义Queue队列,用来存放线程池,Runnable就是线程对象

private static Queue queue = new ConcurrentLinkedDeque<>();//类加载执行多线程

static{

(new TestThread()).newThreadPoolInvoke().start();

}private class ThreadPoolInvoke extendsThread{

@Overridepublic voidrun() {//死循环一直判断队列

while (true) {try{//如果为空,线程睡眠3秒

if(queue.isEmpty()) {

Thread.sleep(1000 * 3);

}//如果不为空则执行任务,定义excute方法

excute();

}catch(Exception e) {//TODO: handle exception

}

}

}

}/*** 设置线程到队列方法

*@paramrunnable*/

public static voidsetTask(Runnable runnable) {

queue.add(runnable);

}/*** 执行线程任务*/

private voidexcute() {//为了确保线程安全,这里可以设置同步锁,this表示当前进入者//synchronized (this) {//获取queue队列size

int curLen =queue.size();for (int i = 0; i < curLen; i++) {//poll 方法表示从队列中删除第一个元素

Runnable item =queue.poll();//然后把对象交给多线程处理

pool.execute(item);

}//}

}

}

好了,今天的多线程分享就到这,是否学会了呢?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值