线程池 java 例子_线程和线程池的理解与java简单例子

本文介绍了Java中的线程概念,通过继承Thread类和实现Runnable接口创建线程,并展示了如何启动和管理线程。同时,文章探讨了线程池的概念,以newFixedThreadPool为例说明线程池如何管理和复用线程,减少资源消耗。
摘要由CSDN通过智能技术生成

1.线程

(1)理解,线程是系统分配处理器时间资源的基本单元也是系统调用的基本单位,简单理解就是一个或多个线程组成了一个进程,进程就像爸爸,线程就像儿子,有时候爸爸一个人干不了活就生了几个儿子干活,会比较快,例如你打开视频软件在线看视频,那有一个线程负责下载,一个线程负责播放...,视频软件就相当爸爸,线程就像儿子们,好处就是可以并发,效率高;

2-1.继承Thread线程类

class ThreadUseExtends extends Thread

//通过继承Thread类,并实现它的抽象方法run()

//适当时候创建这一Thread子类的实例来实现多线程机制

//一个线程启动后(也即进入就绪状态)一旦获得CPU将自动调用它的run()方法

{

ThreadUseExtends(){}//构造函数

public void run()

{

System.out.println("我是Thread子类的线程实例!");

System.out.println("我将挂起10秒!");

System.out.println("回到主线程,请稍等,刚才主线程挂起可能还没醒过来!");

try

{

sleep(10000);//挂起10秒

}

catch (InterruptedException e)

{

return;

}

//如果该run()方法顺序执行完了,线程将自动结束,而不会被主线程杀掉

//但如果休眠时间过长,则线程还存活,可能被stop()杀掉

}

}

2-2.实现 Runnable接口 代码简单

class ThreadUseRunnable implements Runnable

//通过实现Runnable接口中的run()方法,再以这个实现了run()方法的类

//为参数创建Thread的线程实例

{

//Thread thread2=new Thread(this);

//以这个实现了Runnable接口中run()方法的类为参数创建Thread类的线程实例

ThreadUseRunnable(){}//构造函数

public void run()

{

System.out.println("我是Thread类的线程实例并以实现了Runnable接口的类为参数!");

System.out.println("我将挂起1秒!");

System.out.println("回到主线程,请稍等,刚才主线程挂起可能还没醒过来!");

try

{

Thread.sleep(1000);//挂起1秒

}

catch (InterruptedException e)

{

return;

}

//如果该run()方法顺序执行完了,线程将自动结束,而不会被主线程杀掉

//但如果休眠时间过长,则线程还存活,可能被stop()杀掉

}

}

2-3.接下来测试以上两个类

public class ThreadTest {

/**

*学习多线程例子

* @param args

* @author JJ

*/

public static void main(String[] args) {

System.out.println("我是主线程!");

//下面创建线程实例thread1

ThreadUseExtends thread1=new ThreadUseExtends();

//创建thread2时以实现了Runnable接口的THhreadUseRunnable类实例为参数

Thread thread2=new Thread(new ThreadUseRunnable(),"SecondThread");

thread1.start();//启动线程thread1使之处于就绪状态

//thread1.setPriority(6);//设置thread1的优先级为6

//优先级将决定cpu空出时,处于就绪状态的线程谁先占领cpu开始运行

//优先级范围1到10,MIN_PRIORITY,MAX_PRIORITY,NORM_PAIORITY

//新线程继承创建她的父线程优先级,父线程通常有普通优先级即5NORM_PRIORITY

System.out.println("主线程将挂起7秒!");

try

{

Thread.sleep(3000);//主线程挂起7秒

}

catch (InterruptedException e)

{

return;

}

System.out.println("又回到了主线程1!");

if(thread1.isAlive())

{

thread1.stop();//如果thread1还存在则杀掉他

System.out.println("thread1休眠过长,主线程杀掉了thread1!");

}

else

System.out.println("主线程没发现thread1,thread1已醒顺序执行结束了!");

thread2.start();//启动thread2

System.out.println("主线程又将挂起7秒!");

try

{

Thread.sleep(7000);//主线程挂起7秒

}

catch (InterruptedException e)

{

return;

}

System.out.println("又回到了主线程2!");

if(thread2.isAlive())

{

thread2.stop();//如果thread2还存在则杀掉他

System.out.println("thread2休眠过长,主线程杀掉了thread2!");

}

else

System.out.println("主线程没发现thread2,thread2已醒顺序执行结束了!");

System.out.println("程序结束按任意键继续!");

try

{

System.in.read();

}

catch (IOException e)

{

System.out.println(e.toString());

}

}//main

}

2-4.运行查看效果

3cff9591e1810df5e82008065eee2432.png

2.线程池

(1)理解,线程池就是用来管理线程的,线程要创建摧毁很耗时和内存资源,就像一次性筷子生产到扔掉,我们线程池就像家用筷子,可以用很多次,线程池就是这么一个作用

2-1.固定大小的线程池,newFixedThreadPool:

packageapp.executors;

importjava.util.concurrent.Executors;

importjava.util.concurrent.ExecutorService;

/**

* Java线程:线程池

*

* @author 冯小卫

*/

publicclassTest {

publicstaticvoidmain(String[] args) {

// 创建一个可重用固定线程数的线程池

ExecutorService pool = Executors.newFixedThreadPool(5);

// 创建线程

Thread t1 = newMyThread();

Thread t2 = newMyThread();

Thread t3 = newMyThread();

Thread t4 = newMyThread();

Thread t5 = newMyThread();

// 将线程放入池中进行执行

pool.execute(t1);

pool.execute(t2);

pool.execute(t3);

pool.execute(t4);

pool.execute(t5);

// 关闭线程池

pool.shutdown();

}

}

classMyThreadextendsThread {

@Override

publicvoidrun() {

System.out.println(Thread.currentThread().getName() + "正在执行。。。");

}

}

运行结果和其他解释具体可以参照一下上面链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值