多线程——线程模型

什么是程序?

安装在磁盘上的一段指令集合,它是静态的概念。

什么是进程?

它是运行中的程序,是动态的概念,每个进程都有独立的资源空间。

什么是线程?

线程,又称为轻量级进程,是程序执行流的最小单元,是程序中一个单一的顺序控制流程。线程是进程的一个实体,是被系统独立调度和分派的基本单位。

什么是多线程?

多线程则指的是在单个程序中可以同时运行多个不同的线程执行不同的任务。

多线程的特点

①   一个进程可以包含一个或多个线程。

②   一个程序实现多个代码同时交替运行就需要产生多个线程。

③   线程本身不拥有系统资源,与同属一个进程的其它线程共享所在进程所拥有的资源。

④   同一进程中的多个线程之间可以并发执行。CPU会随机抽出时间,让我们的程序一会做这件事情,一会做另外一件事情。

多线程的目的

就是“最大限度地利用CPU资源”,当某一线程的处理不需要占用CPU而只和I/O等资源打交道时,让需要占用CPU资源的其它线程有机会获得CPU资源。从根本上说,这就是多线程编程的最终目的。

Java运行系统在很多方面依赖于线程,所有的类库设计都考虑到多线程。Java是纯面向对象语言,Java的线程模型也是面向对象的。

创建线程

通过继承Thread类创建线程

①   普通Java类如继承自Thread类,就成为一个线程类,并可通过该类的start方法来启动线程,执行线程代码。

②   Thread类的子类可直接实例化,但是子类中必须覆盖run方法才能真正运行线程的代码。

通过实现Runnable接口创建线程

①   实现Runnable接口的类必须借助Thread类才能创建线程。通过Runnable接口创建线程分为两步:

a)         创建实现Runnable接口的类的实例。

b)         创建一个Thread类对象,将第一步实例化得到的Runnable对象作为参数传入Thread类的构造方法。

②   通过Thread类的start方法启动线程。

Code:

继承Thread创建线程

 1 class HelloThread extends Thread {
 2     public HelloThread(String name){
 3         super(name);
 4     }
 5     @Override
 6     public void run() {
 7         for (int i = 0; i < 5; i++) {
 8             //获取线程的名称
 9             System.out.println(this.getName()+":"+i);
10         }
11     }
12 }

主方法:

1         HelloThread h1 = new HelloThread("a");//构造方法中设置线程名称
2         //h1.setName("线程1");//设置线程名称(默认构造)
3         h1.start();//开始线程
4         HelloThread h2=new HelloThread("b");
5         //h2.setName("线程2");
6         h2.start();

多次执行程序,执行结果不同,说明线程一旦开启,随机执行。

使用Runnable接口创建线程

 1 class HelloRunnable implements Runnable {
 2
 3     @Override
 4     public void run() {
 5         for (int i = 0; i < 5; i++) {
 6             // 获取线程的名称
 7             System.out.println(Thread.currentThread().getName() + ":" + i);
 8         }
 9     }
10
11 }

主方法:

1         HelloRunnable helloRunnable = new HelloRunnable();
2         Thread t1 = new Thread(helloRunnable, "A");
3         t1.start();
4         Thread t2 = new Thread(helloRunnable, "B");
5         t2.start();

使用Runnable接口创建线程有以下2个好处:

1、避免单继承的局限,一个类可以实现多个接口,但是只能继承一个类

2、适合资源共享

举例:在2个窗口中出售5张票:

使用Thread创建线程时:

 1 class TickThread extends Thread {
 2     private int ticket = 5;
 3
 4     public TickThread(String name) {
 5         super(name);
 6     }
 7
 8     @Override
 9     public void run() {
10         while (true) {
11             System.out.println(this.getName()+":"+(ticket--));
12             if(ticket<1){
13                 break;
14             }
15         }
16     }
17 }

主方法:

1         TickThread s1=new TickThread("一号窗口");
2         s1.start();
3         TickThread s2=new TickThread("二号窗口");
4         s2.start();

执行后发现,2个窗口各出售了5张票

使用Runnable接口创建线程时:

 1 class TickRunnable implements Runnable{
 2     private int ticket = 5;
 3
 4     @Override
 5     public void run() {
 6         while (true) {
 7             System.out.println(Thread.currentThread().getName()+":"+(ticket--));
 8             if(ticket<1){
 9                 break;
10             }
11         }
12     }
13
14 }

主方法:

1         TickRunnable runnable=new TickRunnable();
2         Thread t1=new Thread(runnable, "一号窗口");
3         t1.start();
4         Thread t2=new Thread(runnable, "二号窗口");
5         t2.start();

执行后可以看到5张票由2个窗口共同出售,因为只产生了一个对象

时间: 2024-10-26 19:15:14

多线程——线程模型的相关文章

posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序

posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 “线程实现”建立在“进程控制”机制之上,由用户空间的程序库来管理.OS内核完全不知道线程信息.这些线程称为用户空间线程.这些线程都工作在“进 程竞争范围”(process contention scope):各个线程在同一进程竞争“被调度的CPU时间”(但

多线程(八)常用的线程模型

在处理业务的时候,有时候需要根据情况使用不同的线程处理模型来处理业务逻辑,这里演示一下常见的线程模型使用技巧. 1.Future模型 前面的章节中提到过Future模型,该模型通常在使用的时候需要结合Callable接口配合使用.Future:未来的.将来的,再结合Callable大概可以明白其功能. Future是把结果放在将来获取,当前主线程并不急于获取处理结果.允许子线程先进行处理一段时间,处理结束之后就把结果保存下来,当主线程需要使用的时候再向子线程索取. Callable是类似于Run

redis和memcached有什么区别?redis的线程模型是什么?为什么单线程的redis比多线程的memcached效率要高得多(为什么redis是单线程的但是还可以支撑高并发)?

1.redis和memcached有什么区别? 这个事儿吧,你可以比较出N多个区别来,但是我还是采取redis作者给出的几个比较吧 1)Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去.这大大增加了网络IO的次数和数据体积.在Redis中,这些复杂的操作通常和一般的GET/SET一样高效.所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是

Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么单线程的 Redis 比多线程的 Memcached 效率要高得多?

面试题 redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发? 面试官心理分析 这个是问 redis 的时候,最基本的问题吧,redis 最基本的一个内部原理和特点,就是 redis 实际上是个单线程工作模型,你要是这个都不知道,那后面玩儿 redis 的时候,出了问题岂不是什么都不知道? 还有可能面试官会问问你 redis 和 memcached 的区别,但是 memcached 是早些年各大互联网公司常用的缓存方案,但是现在近

多线程--生产者/消费者线程模型

//程序演进1 //thread loop,忙等Busy wait //不断的检查是不是该做什么事情了:为了减少CPU占用,sleep睡眠一会 //while (1) //{ // do_something(); // sleep(time); //} //程序演进2 //while (1) //{ // read_form_intput(); // do_something(); //} //程序员演进3,消息模型 //while (waitForMsg) //{ // if (isQuitM

Netty线程模型

一.Reactor模型 1.单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接: 2)作为NIO客户端,向服务端发起TCP连接: 3)读取通信对端的请求或者应答消息: 4)向通信对端发送消息请求或者应答消息 Reactor单线程模型示意图如下所示: 由于Reactor模式使用的是异步非阻塞IO,所有的IO操作都不会导致阻塞,理论上一个线程可以独立处理所有IO相关的操作.从架构层面看,一个NI

Java的多线程编程模型5--从AtomicInteger开始

Java的多线程编程模型5--从AtomicInteger开始 2011-06-23 20:50 11393人阅读 评论(9) 收藏 举报 java多线程编程jniinteger测试 AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字.而AtomicInteger则通过一种线程安全的加减操作接口. 来看AtomicInteger提供的接口. //获取当前的值 publ

Netty系列之Netty线程模型

1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比较流行的是单线程编程,对于CPU密集型的应用程序而言,频繁的通过多线程进行协作和抢占时间片反而会降低性能. 1.1.2. 多线程 随着硬件性能的提升,CPU的核数越来越越多,很多服务器标配已经达到32或64核.通过多线程并发编程,可以充分利用多核CPU的处理能力,提升系统的处理效率和并发性能. 相关

看我是如何处理自定义线程模型---java

看过我之前文章的园友可能知道我是做游戏开发,我的很多思路和出发点是按照游戏思路来处理的,所以和web的话可能会有冲突,不相符合. 来说说为啥我要自定义线程模型呢? 按照我做的mmorpg或者mmoarpg游戏划分,线程被划分为,主线程,全局同步线程,聊天线程,组队线程,地图线程,以及地图消息分发派送线程等: 一些列,都需要根据我的划分,以及数据流向做控制. 游戏服务器,主要要做的事情,肯定是接受玩家的 命令请求 -> 相应的操作 -> 返回结果: 在服务器端所有的消息都会注册到消息管理器里,然