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注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...
随机推荐
- python的可变对象与不可变对象
a = 1print(id(a))def fun(a): a = 2 print(a,id(a))fun(a)print(a,id(a)) # 1#为什么这里的a的值没有改变#因为在函数里变量赋值(内 ...
- FOB注意事项
1. FOB是我们作为贸易公司去联系物流公司将货送到码头,缴纳FOB cost 以后,海关安排码头的人送到船上. 2.在这之前,买方自己订船,然后发给卖方入货通知,卖方安排发货. 3.FOB cost ...
- Android Studio 集成开发工具教学视频
简介 经过2年时间的研发,Google终于正式发布了面向Android开发者的集成开发环境Android Studio 1.2(稳定版).Android Studio是Google开发的一款面向And ...
- php hook编程机制
说明 hook,中文翻译为钩子,编程中的钩子类似我们现实中的钩子,需要挂在东西的时候 直接挂载到上面即可.程序中也是,需要运行的代码挂载到上面即可. 具体思想就是:在项目代码中, ...
- 【转】RabbitMQ基础——和——持久化机制
这里原来有一句话,触犯啦天条,被阉割!!!! 首先不去讨论我的日志组件怎么样.因为有些日志需要走网络,有的又不需要走网路,也是有性能与业务场景的多般变化在其中,就把他抛开,我们只谈消息RabbitMQ ...
- MySQL千万级数据库查询怎么提高查询效率
在实际项目中,当MySQL表的数据达到百万级别时候,普通查询效率直线下降,而且当使用的where条件较多,其查询效率是让人无法容忍的.假如一个taobao订单查询详情要几十秒,可想而知的用户体验是多差 ...
- nuget安装本地nupkg文件
打开visual studio,菜单选择‘工具’->‘选项’ 然后 接下来,选择‘程序包源’,把‘包括预发行版’打钩,然后安装需要的包到工程即可,如下图:
- [树上倍增+二分答案][NOIP2012]运输计划
题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 公元 2044 年,人类进入了宇宙纪元 L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间,这 n-1n− ...
- shell 到达一定数量文件自动删除最久时间文件
#!/bin/bash#rm_file>14day ReservedNum=4 #保留文件数量rm_file_dir='/home/sean/sean/ ...
- Python json.dumps 自定义序列化操作
def login_ajax(request): if request.method == "GET": return render(request, 'login_ajax.ht ...