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. margin的垂直方向塌陷

    标签(空格分隔): margin塌陷 margin垂直方向塌陷问题: 如下代码: <!DOCTYPE html> <html lang="en"> < ...

  2. Centos 7下网卡bonding配置之mode4

    一.bonding技术 bonding(绑定)是一种linux系统下的网卡绑定技术,可以把服务器上n个物理网卡在系统内部抽象(绑定)成一个逻辑上的网卡,能够提升网络吞吐量.实现网络冗余.负载等功能,有 ...

  3. 100-days: twenty-four

    Title: No word of a lie: scientists rate(评出) the world's biggest peddlers of bull(说瞎话的人,扯淡的人) bullsh ...

  4. Java8-函数式接口理解及测试

    1.  函数式接口的理解 根据重构的思想,需要把容易变化的模块进行抽象并封装起来,从这个点来看,Java8新引入的函数式接口就是基于这个思想进行设计的. 2. 函数式接口定义 2.1 自定义如下 需要 ...

  5. 求数组中两数之和等于target的两个数的下标

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元 ...

  6. Flask-WTForms 简单使用

    安装 wtforms 2.2.1 直接上代码: app.py 文件: from flask import Flask, render_template, request from wtforms im ...

  7. 分布式系统-主键唯一id,订单编号生成-雪花算法-SnowFlake

    分布式系统下 我们每台设备(分布式系统-独立的应用空间-或者docker环境) * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作 ...

  8. sftp免密登录

    最近在linux服务器上搭建了一个sftp服务器,在做免密登录时,因为理解的问题,走了些弯路,在此记录一下. 先来说一下服务器端,在服务端的每一个用户的根目录下都有一个.ssh目录,在这个下面放的公私 ...

  9. 修改Myeclipse的文件默认为UTF-8编码

    一.工程编码默认调整 windows->Preferences...打开"首选项"对话框, 左侧导航树,导航到general->Workspace,右侧 Text fi ...

  10. HTTP知识点【总结篇】

    1.什么是HTTP协议? 客户端和服务器之间数据传输的格式规范.全拼:HyperText Transfer Protocol:超文本传输协议. 2.http协议是无状态协议?怎么解决无状态协议? 无状 ...