Java学习之多线程

讲到线程,就必须要懂得进程,进程是相当于一个程序的开始到结束,而线程是依赖于进程的,没有进程,就没有线程。线程也分主线程和子线程,当在主线程开启子线程时,主线程结束,而子线程还可以继续运行。学习多线程需要有一种多并发的思想,要摒弃以往的那种面向过程式编程,以前一直觉得程序在运行的时候只会跟著代码一步一步的走,只能沿着一条时间线,现如今学到了java的多线程才是打开了我新世界的大门。Java是一门伟大的语言,必须要认真的学习之精髓。

首先了解一下3种创建多线程的方式。

  1. 创建新类,通过继承Thread并且重写run方法,开启新线程的时候,run中的方法就是这个线程所要干的事情。然后实例化,在用.Start()来真正开启新线程。
  2. 创建新类,继承Runnable接口,然后实现run方法,新线程开启后,执行的是run中的方法。真正开启的时候,是创建一个Thread实例,再往Thread(加入参数)实例中加入该新类的实例以作为创建的参数。
  3. 匿名类方法开启新线程,在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类型的数;

  1. incrementAndGet()表示自加1;
  2. decrementAndGet()表示自减1;
  1. addAndGet(3) 表示自加3;

好了,以上是java线程的初步学习,以后会补充深层次的知识点和理解。

2019/3/7 晚11点

2019/3/7 Java学习之多线程(基础)的更多相关文章

  1. JAVA学习总结-多线程基础:

    参考书籍:疯狂JAVA讲义 1.进程和线程; 进程是处于运行过程中的程序;并且具有一定的独立功能;进程是系统进行系统资源分配和调度的一个独立单位. 一般而言,进程包括以下三个特征: 独立性:进程是系统 ...

  2. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  3. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  4. Java学习笔记之---基础语法

    Java学习笔记之---基础语法 一. Java中的命名规范 (一)包名 由多个单词组成时,所有字母小写(例如:onetwo) (二)类名和接口 由多个单词组成时,所有单词首字母大写(例如:OneTw ...

  5. 2019最新版Java程序员零基础入门视频教程资料(全套)

    为了解决Java学习初学者在网上找视频难的事情,本人整理了一份2019年度最新版的Java学习视频教程.希望看到这份视频的你们都能找到一份称心的工作,技术上都能得到进一步的提升,好东西就要分享给你们, ...

  6. Java学习---程序设计_基础题[1]

    180813 补全没有的答案! 0. 数组排序大全[冒泡/选择/快速/插入] package com.ftl; import java.io.BufferedReader; import java.i ...

  7. JAVA学习笔记之基础概念(一)

    一.Java 简介: Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称. 由 James Gosling和同 ...

  8. Java学习1——计算机基础知识

    本文包含了一些计算机基础知识:计算机组成:Windows常用快捷键:DOS常用命令:计算机语言发展史.

  9. Java学习之旅基础知识篇:数据类型及流程控制

    经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...

随机推荐

  1. Python列表的三种遍历(序号和值)的方法

    #-×-coding:utf-8-*- if _name_=='_main_': list=['html','js','css','python'] #方法1 print ‘遍历列表方法1’ for ...

  2. 区块链之Hyperledger(超级账本)Fabric v1.0 的环境搭建(更新)

    参考链接:https://blog.csdn.net/so5418418/article/details/78355868   https://blog.csdn.net/wgh1015398431/ ...

  3. Python的range()函数用法

    Python的range()函数有三种用法,简单地说就是下图的三种用法: 运行结果如下:

  4. spring注解式参数校验

    很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者返回异常时的校验信息,在代码中相当冗长,今天我们就来学习spring注解式参数校验. 其实就是:hibernate的validator. 开始啦. ...

  5. CentOS7 安装VNC

    系统环境:CentOS Linux release 7.6.1810Kernel:3.10.0-957.el7.x86_64系统现状:最小化安装,没有安装任何图形支持软件 安装图形化支持 不建议安装G ...

  6. FastDFS防盗链

    FastDFS扩展模块内置了通过token来实现防盗链的功能.开启防盗链后,访问文件是需要在url中加两个参数:token和ts.ts为时间戳,token为系统根据时间戳和密码生成的信物.为了系统的安 ...

  7. SNORT入侵检测系统

    SNORT入侵检测系统 YxWa · 2015/10/09 10:38 0x00 一条简单的规则 alert tcp 202.110.8.1 any -> 122.111.90.8 80 (ms ...

  8. 【转载】http proxy原理

    最近使用Charles抓https包时,发现get和post方式的请求都能抓到,但是method为connect的就是抓不到.而且提示如下: You may need to configure you ...

  9. java 日志体系(三)log4j从入门到详解

    java 日志体系(三)log4j从入门到详解 一.Log4j 简介 在应用程序中添加日志记录总的来说基于三个目的: 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作: 跟踪代 ...

  10. 初识spark的MLP模型

    初识Spark的MLP模型 1. MLP介绍 Multi-layer Perceptron(MLP),即多层感知器,是一个前馈式的.具有监督的人工神经网络结构.通过多层感知器可包含多个隐藏层,实现对非 ...