简述java的线程_Java多线程的简述

线程与进程

进程:

​ 是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。

线程:

​ 进程内部的一个独立执行单元;一个进程可以同时并发地运行多个线程,可以理解为一个进程便相当于一个单 CPU 操作系统,而线程便是这个系统中运行的多个任务。

进程与线程的区别:

​ 进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。

​ 线程:堆空间是共享的,栈空间是独立的,线程消耗的资源比进程小的多。

注意:

因为一个进程中的多个线程是并发运行的,那么从微观角度看也是有先后顺序的,哪个线程执行完全取决于CPU 的调度,程序员是不能完全控制的(可以设置线程优先级)。而这也就造成的多线程的随机性。

Java 程序的进程里面至少包含两个线程,主线程也就是 main()方法线程,另外一个是垃圾回收机制线程。每当使用 java 命令执行一个类时,实际上都会启动一个 JVM,每一个 JVM 实际上就是在操作系统中启动了一个线程,java 本身具备了垃圾的收集机制,所以在 Java 运行时至少会启动两个线程。

由于创建一个线程的开销比创建一个进程的开销小的多,那么我们在开发多任务运行的时候,通常考虑创建多线程,而不是创建多进程。

多线程

多线程技术可以更好地利用系统资源。主要优势在于充分利用了CPU的空闲时间片,用尽可能少的时间来对用户的要求做出响应,使得进程的整体运行效率得到较大提高,同时增强了应用程序的灵活性。

​ 更为重要的是,由于同一进程的所有线程共享同一内存,所以不需要特殊的数据传送机制,不需要建立共享存储区或共享文件,从而使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。

创建多线程的五种方式

1.继承Thread类

Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。

启动线程的唯一方法就是通过Thread类的start()实例方法。

start()方法是Java的native方法,它将启动一个新线程,并执行run()方法。

这种方法实现多线程比较简单,通过自己创建的类直接继承Thread,并重写run()方法,就可以启动新线程并执行自己定义的run()方法。

优点:代码比较简单

缺点:该类无法继承其他类

1 public classThreadDemo1 {2

3 public static voidmain(String[] args) {4 ThreadDemo t1 = newThreadDemo();5 t1.setName("线程1");6 t1.start();7 ThreadDemo t2 = newThreadDemo();8 t2.setName("线程2");9 t2.start();10 }11

12 }13

14 class ThreadDemo extendsThread{15 @Override16 public voidrun() {17 for (int i = 1; i <= 10; i++) {18 System.out.println(Thread.currentThread().getName()+":"+i);19 }20 }21 }

2.实现Runnable接口

Java的继承属于单继承,如果一个类继承了其他的一个类就无法继承Thread类。但是一个类继承一个类的同时,可以实现多个接口。

优点:继承其他类,统一实现该接口的实例可以共享资源。

缺点:代码比较复杂。

1 public classThreadDemo2 {2

3 public static voidmain(String[] args) {4 MyThread myThread= newMyThread();5 Thread t1 = new Thread(myThread, "线程1");6 t1.start();7 Thread t2 = new Thread(myThread, "线程2");8 t2.start();9 }10

11 }12

13 class MyThread implementsRunnable{14 @Override15 public voidrun() {16 for (int i = 1; i <= 10; i++) {17 System.out.println(Thread.currentThread().getName()+":"+i);18 }19 }20 }

3.实现Callable接口

实现Callable接口和实现Runnable接口的方法基本相同,不过Callable接口中的call()方法有返回值,Runnable接口中的call()方法没有返回值。

1 public classThreadDemo3 {2

3 public static void main(String[] args) throwsExecutionException, InterruptedException {4 Callable myCallable = new MyCallable();5 //使用FutureTask类包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值

6 FutureTask futureTask = new FutureTask(myCallable);7 Thread t1 = new Thread(futureTask, "线程1");8 t1.start();9 System.out.println(futureTask.get());10 }11 }12

13

14 class MyCallable implements Callable{15

16 @Override17 public Object call() throwsException {18 for (int i = 1; i <= 10; i++) {19 System.out.println(i);20 }21 return Thread.currentThread().getName()+"执行完毕";22 }23 }

4.线程池

线程池,其实就是一个容纳多个线程的容器,其中的线程可以重复使用,省去了频繁创建线程对象的操作,避免了频繁创建线程的资源消耗。

Executor类:提供了一系列工厂方法用于创建线程池,返回的线程池都实现了ExecutorService接口。

Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

ExecutorService提供了sumbit()方法,传递一个Callable或Runnable,将线程放进线程池中,并执行。

优点:实现自动化装配,易于管理,循环利用资源。

1 public classThreadDemo4 {2

3 public static voidmain(String[] args) {4 ExecutorService pool = Executors.newFixedThreadPool(2);5 //将线程放入线程池中并执行

6 Future> submit = pool.submit(newMyRunnableThread());7 pool.submit(newMyRunnableThread());8 //关闭线程池

9 pool.shutdown();10 }11

12 }13

14 class MyRunnableThread implementsRunnable {15 @Override16 public voidrun() {17 for (int i = 1; i <=10 ; i++) {18 System.out.println(Thread.currentThread().getName()+":"+i);19 }20 }21 }

5.Timer类和TimerTask类

在这种实现方式中,Timer类实现的是类似定时任务的功能,也就是定时或者每隔一定时间触发一次线程。

Timer类本身实现的就是一个线程,只是这个线程是用来调用其他线程。

TimerTask类实现了Runnable接口,具备了多线程的能力。

在这种实现方式中,通过继承TimerTask使该类获得多线程的能力,重写run()方法,然后通过Timer类启动线程。

在实际使用时,一个Timer可以启动任意多个TimerTask实现的线程,但是多个线程之间会存在阻塞。所以如果多个线程之间如果需要完全独立运行的话,

最好还是一个Timer启动一个TimerTask实现。

1 public classThreadDemo5 {2

3 public static voidmain(String[] args) {4 Timer timer = newTimer();5 MyTimerTask myTimerTask1 = new MyTimerTask("线程1");6 MyTimerTask myTimerTask2 = new MyTimerTask("线程2");7 //启动线程

8 timer.schedule(myTimerTask1,0);9 timer.schedule(myTimerTask2,0);10 }11

12 }13

14 class MyTimerTask extendsTimerTask{15 privateString TimerTaskName;16

17 publicMyTimerTask(String TimerTaskName) {18 this.TimerTaskName=TimerTaskName;19 }20

21 @Override22 public voidrun() {23 for (int i = 1; i <=10 ; i++) {24 System.out.println(TimerTaskName+":"+i);25 }26 }27 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【POJ - 3253】Fence Repair(贪心,时光倒流)

题干&#xff1a; Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of wood, each having some integer length Li (1 ≤ Li ≤ 50,000) units. He t…

java unsafe park_Java中Unsafe类详解

http://www.cnblogs.com/mickole/articles/3757278.htmlJava不能直接访问操作系统底层&#xff0c;而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作&#xff0c;主要提供了以下功能&#xff1a;1、通过Unsafe类可以分配内存&#xff0c;可以释放内存&#xff1b;类中…

【CodeForces - 124D】Squares (旋转坐标系,计算几何,思维)

题干&#xff1a; You are given an infinite checkered field. You should get from a square (x1; y1) to a square (x2; y2). Using the shortest path is not necessary. You can move on the field squares in four directions. That is, when you are positioned in any…

java图形设计_java图形界面设计含答案

十一章 图形用户界面程序设计入门一&#xff0e;选择题&#xff1a;1. 容器Panel和applet缺省使用的布局编辑策略是 BA、BorderLayout B、FlowLayoutC、GridLayout D、CarLayout2. .applet类的直接父类是&#xff1a; BA、Component类 B、Container类C、Frame类 D、Panel类3. .…

【qduoj - 夏季学期创新题】骑士游历(递推dp)

题干&#xff1a; 描述 输入 输入包含多组数据&#xff0c;第一行T表示数据组数接下来每行六个整数n&#xff0c;m&#xff0c;x1&#xff0c;y1&#xff0c;x2&#xff0c;y2(分别表示n&#xff0c;m&#xff0c;起点坐标&#xff0c;终点坐标) 输出 输出T行&#xff0c;表示…

java ee 6 源码_Java EE 6开发手册·高级篇(第4版)

资源名称&#xff1a;Java EE 6开发手册高级篇(第4版)内容简介&#xff1a;《Java EE 6 开发手册?高级篇(第4 版)》是一本面向实战、以示例为驱动、在Java 平台企业版6(Java EE 6)上开发企业级应用的指南。该指南基于The Java EE 6 Tutorial: Basic Concepts&#xff0c;Fourt…

【qduoj - 夏季学期创新题】矩形剖分(递归,dp)

题干&#xff1a; 描述 对一个给定的矩形&#xff0c;将其划分成尽可能少的正方形&#xff0c;输出正方形的最少个数。例如&#xff0c;如下图所示的情况&#xff0c;则输入为3和4&#xff0c;输出为4。 输入 输入两个整数中间用空格分开。 输出 输出最少分割成的正方形的个…

java8 nio_Java8之 NIO的学习

一、什么是NIO&#xff1f;Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API&#xff0c;可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的&#xff0c;但是使用的方式完全不同&#xff0c;NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式…

【牛客 - 125A】灰魔法师(打表,暴力)

题干&#xff1a; 给出长度为n的序列a, 求有多少对数对 (i, j) (1 < i < j < n) 满足 ai aj 为完全平方数。 输入描述: 第一行一个整数 n (1 < n < 105) 第二行 n 个整数 ai (1 < ai < 105) 输出描述: 输出一个整数&#xff0c;表示满足上述条件的数…

学分绩点计算编程java_方便我们计算学分绩点的JavaScript

基于目前我们学校教务处的管理系统, 依靠Javascript的帮忙, 我们可以很方便地计算成绩.测试用HTML:style"width: 100%; border-collapse: collapse;">课程代码课程名称课程性质成绩补考成绩重修成绩学分绩点辅修标记24109505数据库系统实验专业基础课优秀0.54.502…

【POJ - 2663】Tri Tiling (简单dp)

题干&#xff1a; In how many ways can you tile a 3xn rectangle with 2x1 dominoes? Here is a sample tiling of a 3x12 rectangle. Input Input consists of several test cases followed by a line containing -1. Each test case is a line containing an integer …

java 反射 代码_java反射机制学习代码

根据http://www.iteye.com/topic/137944文档进行学习代码如下:package reflectTest;import java.lang.reflect.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.*;class A{}class B extends A{}class C extends B{}class TestClass …

【POJ - 1556】The Doors (计算几何,线段相交)

题干&#xff1a; You are to find the length of the shortest path through a chamber containing obstructing walls. The chamber will always have sides at x 0, x 10, y 0, and y 10. The initial and final points of the path are always (0, 5) and (10, 5). Th…

java处理linux中的 m_Linux下处理BOM头和^M的简单方法

Linux在网络服务器、嵌入式设备的市场上占有较大份额&#xff0c;Microsoft Windows在桌面操作系统上占有较大的份额&#xff0c;因此有很多的人喜欢用Windows去控制操作Linux。既然用Windows去控制Linux&#xff0c;难免导致Windows系统上的产生的文件以某种途径传到了Linux系…

【POJ - 1696】Space Ant (凸包,最小极角,排序)

题干&#xff1a; The most exciting space discovery occurred at the end of the 20th century. In 1999, scientists traced down an ant-like creature in the planet Y1999 and called it M11. It has only one eye on the left side of its head and just three feet al…

2019蓝桥杯Java决赛题答案_2019第十届蓝桥杯JavaB组省赛真题详解

目录题解待更新第一题&#xff1a;组队题目描述做为篮球队教练&#xff0c;你须要从如下名单中选出 1 号位至 5 号位各一名球员&#xff0c; 组成球队的首发阵容。每位球员担任 1 号位至 5 号位时的评分以下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大多是多少&am…

【FZU - 1759】Super A^B mod C (数论,快速幂,快速乘,欧拉降幂,指数循环节,模板)

题干&#xff1a; Given A,B,C, You should quickly calculate the result of A^B mod C. (1<A,C<1000000000,1<B<10^1000000). Input There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a si…

java map统计学生名单_Java含自己的总结:集合,学生,遍历,ArrayList,Set,Map,泛型,班级,发牌—诗书画唱...

声明一个ArrayList&#xff0c;存储一条学生信息&#xff0c;内容为 1 张三 22 男&#xff0c;将信息进行遍历出来package list;import java.util.ArrayList;import java.util.Iterator;public class student{public static void main(String[] args) {ArrayList jiHe…

【AtCoder - 4242 】To Infinity(思维)

题干&#xff1a; Problem Statement Mr. Infinity has a string S consisting of digits from 1 to 9. Each time the date changes, this string changes as follows: Each occurrence of 2 in S is replaced with 22. Similarly, each 3 becomes 333, 4becomes 4444, 5 b…

java面向对象编程集合边框_JAVA 面向对象 集合框架

1.Java集合框架提供了一套性能优良、使用方便的接口和类&#xff0c;它们位于java.util包中如果并不知道程序运行时会需要多少对象&#xff0c;或者需要 更复杂方式存储对象——可以使用Java集合框架2.java集合框架包括接口、具体类、算法接口&#xff1a;Collection&#xff1…