2019/3/7 Java学习之多线程(基础)
Java学习之多线程
讲到线程,就必须要懂得进程,进程是相当于一个程序的开始到结束,而线程是依赖于进程的,没有进程,就没有线程。线程也分主线程和子线程,当在主线程开启子线程时,主线程结束,而子线程还可以继续运行。学习多线程需要有一种多并发的思想,要摒弃以往的那种面向过程式编程,以前一直觉得程序在运行的时候只会跟著代码一步一步的走,只能沿着一条时间线,现如今学到了java的多线程才是打开了我新世界的大门。Java是一门伟大的语言,必须要认真的学习之精髓。
首先了解一下3种创建多线程的方式。
- 创建新类,通过继承Thread并且重写run方法,开启新线程的时候,run中的方法就是这个线程所要干的事情。然后实例化,在用.Start()来真正开启新线程。
- 创建新类,继承Runnable接口,然后实现run方法,新线程开启后,执行的是run中的方法。真正开启的时候,是创建一个Thread实例,再往Thread(加入参数)实例中加入该新类的实例以作为创建的参数。
- 匿名类方法开启新线程,在main函数下创建Thread实例的同时重写run方法,这个方法不要求创建新类,而且可以根据需求随时方便的改变方法内容。
这3种方法各有益处,看喜欢哪样了!
在多线程情况下,对同一数据进行操作有很大可能导致数据的不同步,也就是导致数据错误,软件的安全性永远在第一位,因此,在如何保证性能最大化的同时也应该把安全放在第一位。
在这个背景下,锁因运而生。锁可以保证在这一时间下除了占有该对象的线程,其他的线程均不能访问这个对象,只有占有完了结束了其他的线程才可以访问。锁的同时还要伴随着线程的交互。关键字wait()是令当前线程释放目前占有的对象并且休眠,直到唤醒并满足运行条件,该线程就会继续工作。关键字notifyAll()是唤醒其他所有等待这个对象的线程,就像一帮等待着食物的猪一样,那头猪吃完了不吃了就唤醒其他的猪叫他们来食用。一般run方法运行完了都会在后面添加notify(),这样可以保证所有等待的线程可以醒来。JDK6以后又新增加了lock方法来进行锁对象。Lock有着与synchornized 不一样的特性,synchornized会一直试图获取对象的使用权,不得到不罢休,一直到天荒地老,直到电脑没电停机了。这样会导致死锁问题,死锁问题是线程1一直占有对象a等待2线程释放对象b,而线程2一直占有对象b,等待1释放a。。。。如此就会导致死锁,这样两个线程就废了!Lock则完美的解决了这个问题,lock的trylock方法可以提供时间,时间是努力争取一段时间的时间,如果争取不了,就放弃。这样就不会死锁了。Lock有很多的特性,希望在以后的项目中可以进一步的深入了解。此外,lock伴随着condition,condition的await()对标wait(),它的signalAll(),对标notify(),其他的都差不多的。
创建新的线程会消耗系统的性能,如果频繁的创建,会导致系统变慢,不利于软件的高效率运行。如果能够创建一个线程池,用的话就加入,完了就回来继续等待任务的开始,这样就可以保证效率啦!建方法:
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
ThreadPoolExecutor pool = new ThreadPoolExecutor( A , B , C , D , E );
A:开始线程的个数
B:不够用后扩容后的个数
C:结合 D的时间尺度类如TimeUnit.SECONDS,过了C秒后没活干就回收!保持A个
D:时间尺度
E: LinkedBlockingQueue<Runnable> 类型的容器
原子访问:就是线程安全的方式,只能保证一次操作是安全的,所以i++,i+=6,是非原子访问。AtormicInterger A = new AtormicInterger( 0 ).表示创建线程安全的为0的基于int类型的数;
- incrementAndGet()表示自加1;
- decrementAndGet()表示自减1;
- addAndGet(3) 表示自加3;
好了,以上是java线程的初步学习,以后会补充深层次的知识点和理解。
2019/3/7 晚11点
2019/3/7 Java学习之多线程(基础)的更多相关文章
- JAVA学习总结-多线程基础:
参考书籍:疯狂JAVA讲义 1.进程和线程; 进程是处于运行过程中的程序;并且具有一定的独立功能;进程是系统进行系统资源分配和调度的一个独立单位. 一般而言,进程包括以下三个特征: 独立性:进程是系统 ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- Java学习笔记之---基础语法
Java学习笔记之---基础语法 一. Java中的命名规范 (一)包名 由多个单词组成时,所有字母小写(例如:onetwo) (二)类名和接口 由多个单词组成时,所有单词首字母大写(例如:OneTw ...
- 2019最新版Java程序员零基础入门视频教程资料(全套)
为了解决Java学习初学者在网上找视频难的事情,本人整理了一份2019年度最新版的Java学习视频教程.希望看到这份视频的你们都能找到一份称心的工作,技术上都能得到进一步的提升,好东西就要分享给你们, ...
- Java学习---程序设计_基础题[1]
180813 补全没有的答案! 0. 数组排序大全[冒泡/选择/快速/插入] package com.ftl; import java.io.BufferedReader; import java.i ...
- JAVA学习笔记之基础概念(一)
一.Java 简介: Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称. 由 James Gosling和同 ...
- Java学习1——计算机基础知识
本文包含了一些计算机基础知识:计算机组成:Windows常用快捷键:DOS常用命令:计算机语言发展史.
- Java学习之旅基础知识篇:数据类型及流程控制
经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...
随机推荐
- Flipping an Image
Given a binary matrix A, we want to flip the image horizontally, then invert it, and return the resu ...
- pyautogui 文档(五):截图及定位功能
截图函数 PyAutoGUI可以截取屏幕截图,将其保存到文件中,并在屏幕中查找图像.如果您有一个小图像,例如需要单击并希望在屏幕上找到它的按钮,这将非常有用.这些功能由PyScreeze模块提供,该模 ...
- pyautogui 文档(二):鼠标控制
0,0 X increases --> +---------------------------+ | | Y increases | | | | 1920 x 1080 screen | | ...
- 浙江省赛之Singing Everywhere
题目:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5996 方法: 在大佬的指导下完成. 寻找峰值,找到一共k个 ...
- node.js中对 redis 的安装和基本操作
一.win下安装redis https://github.com/MicrosoftArchive/redis/releases 下载Redis-x64-3.2.100.zip,然后解压,放到自定义目 ...
- pytesseract在识别只有一个数字的图片时识别不出来
大家好,近期在做自动化测试时,遇到了一个问题需要通过识别图片来实现,遂用到了pytesseract模块和tesseract-ocr这个工具.在使用过程中发现,识别带有数字的图片时,如果这个图片上仅有一 ...
- 消息中间件和JMS介绍
在一个公司创立初期,他可能只有几个应用,系统之间的关联也不是那么大,A系统调用B系统就直接调用B提供的API接口:后来这个公司做大了,他一步步发展有了几十个系统,这时候A系统要调用B系统的接口,但是B ...
- node 单个表加条件查询
export const getTeacher = query => { const wh = model.query(qb => { qb.where('isNoLectur ...
- skynet记录7:服务(c和lua)
稍后填坑 1.c服务的写法(第一个服务logger分析) 2.lua服务的写法(第二个服务bootstrap分析) 3.snlua包装模块
- 跨域的处理方式 JSONP和CORS和反向代理
什么是跨域? 首先了解同源策略,三个相同,协议,域名端口号相同就是同源,那么三者有任意不同就会造成跨域.跨域不常见,跨域基本上就是访问别人的资源. 如何解决跨域问题? 常见的有三种 一:jsonp处理 ...