JAVA多线程的学习笔记

Wesley13
• 阅读 705

第一次在开源中国上发博文,简单的把以前在达内培训JAVA时的一篇日志复制共享一下。

多进程(多任务)- 针对OS

多线程(Thread) - 一个进程内部的多任务

java语言(JVM)支持多线程编程

java.lang.Thread

Thread类由JDK提供,用于封装对JVM中线程的控制,调用C语言的类库实现。

1、创建一个线程

JVM会创建默认的线程 main用于运行main方法。

程序员可以创建自己定义的线程(定义线程的运行体)

-------------------------------------

public class MyThread extends Thread {

//重写Thread的run方法

//用于指定线程的运行体

@Override

public void run(){

//super.run();

for(int i=0;i<100000;i++){

System.out.println("run"+i);

}

}

}

**************************

public class TestThread {

public static void main(String[] args) {

Thread t=new MyThread();

t.start();//启动一个线程,即时返回

      //t.run();//调用方法

for(int i=0;i<100000;i++){

System.out.println("main"+i);

}

}

}

-----------------------------------

Thread.sleep(long l);

作用:让当前线程(运行该方法的线程)“挂起”sleep

public class MyThread extends Thread {

//重写Thread的run方法

//用于指定线程的运行体

@Override

public void run(){

//super.run();

for(int i=0;i<100000;i++){

try{

Thread.sleep(100);

}catch(InterruptedException ee){

}

System.out.println("run"+i);

}

}

}

****************************

public class TestThread {

public static void main(String[] args) throws InterruptedException {

Thread t=new MyThread();

t.start();//启动一个线程

for(int i=0;i<100000;i++){

         Thread.sleep(200);

System.out.println("main"+i);

}

}

}

------------------------------------------

day2

(1)、进程中的多任务

(2)、MyThread extends Thread{

  //指定线程的运行体

  public void run(){...}

}

  Thread t = new MyThread();

  t.start();

Thread.sleep();//让当前线程挂起

(3)、线程的状态及其转换

        block-->running-->ready--->running

(4)、守护线程

  通过setDaemon方法,可以设置线程为守护线程。JVM如果发现当前的线程全部是守护线程时,就退出。

import java.util.Date;

public class MyThread extends Thread {

// 重写Thread的run方法

// 用于指定线程的运行体

@Override

public void run() {

while (true) {

System.out.println(new Date());

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

}

}

}

}

*****************************

import java.io.IOException;

public class Main {

public static void main(String[] args) throws IOException {

Thread t=new MyThread();

//设置为守护线程,默认为fales;

t.setDaemon(true);

t.start();

System.out.println("Main");

System.in.read();

}

}

(5)、Runnable接口

方法1)、Thread t = new MyThread();

     //MyThread 是Thread的子类

小程序(麻烦的例子,非Runnable例子)

public class MyThread extends Thread {

private NameList nameList;

public MyThread(NameList nameList){

this.nameList=nameList;

}

// 重写Thread的run方法

// 用于指定线程的运行体

@Override

public void run() {

while (true) {

try {

//打印集合中的内容

nameList.printNames();

Thread.sleep(5000);

} catch (InterruptedException e) {

}

}

}

}

*****************************

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.List;

public class NameList {

private List nameList = new ArrayList();

public void addName(String name){

nameList.add(name);

}

public void printNames(){

System.out.println(nameList);

}

public static void main(String[] args) throws Exception {

NameList nameList=new NameList();

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

Thread t=new MyThread(nameList);

t.setDaemon(true);

t.start();

String str;

while((str=br.readLine())!=null){

if(str.equalsIgnoreCase("exit")){

break;

}

nameList.addName(str);

}

}

}

方法2)、Thread t = new Thread(r);

         其中r为实现了Runnable接口的类的对象

    class SomeClass

        implements Runnable{

           Public void run(){.........}

           }

    SomeClass sc = new SomeClass()

    Thread t = new Thread(sc)

    t.start();

    //线程的运行体是sc的run方法

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.List;

public class NameList implements Runnable{

private List nameList = new ArrayList();

public void addName(String name){

nameList.add(name);

}

public void printNames(){

System.out.println(nameList);

}

public void run() {

while (true) {

try {

//打印集合中的内容

printNames();

Thread.sleep(5000);

} catch (InterruptedException e) {

}

}

}

public static void main(String[] args) throws Exception {

NameList nameList=new NameList();

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

Thread t=new Thread(nameList);

t.setDaemon(true);

t.start();

String str;

while((str=br.readLine())!=null){

if(str.equalsIgnoreCase("exit")){

break;

}

nameList.addName(str);

}

}

}

方法3)、内部类---以后再说

(6)、线程安全问题

   两个以上的线程访问同一个可变对象。

   加锁

synchronized (obj) {

语句块;//obj为Object的任意对象,用obj作为唯一锁来加锁。有多个synchronized(??)的时候,如果都用obj的话,相当于只有obj一条钥匙。如果除了obj还有其他如obj1的情况下,obj加锁的不防碍obj1的锁。

}

      public void f(){synchronized(this/*必须是this并且已把这个线程需要的方法的所有代码都包括起来*/){......}} 等价于 public synchronized void f(){.........}

(7)、常见的线程安全的类和线程不安全的类

String //不可变类,线程安全

Integer Double... //不可变类,线程安全

StringBuffer //线程安全,相当于StringBuilder加了synchronized

StringBuilder //线程不安全,通常用于单线程,加锁会阻碍代码的执行速度

ArrayList //线程不安全,所有集合类(除了Vector 、Hashtable)都是线程不安全

HashSet //线程不安全

HashMap //线程不安全

Vector //线程安全(JDK1.1老版本开始出现)

  特别例子:优化代码

   Vector vector=....

   int size = vector.size();//优化语句,只调用一次Vecto加快代码执行速度

    for(int i=0;i<size/*vector.size()*/;i++){...}//for循环因为多次调用Vector会因为加锁的问题影响代码执行速度

Hashtable //线程安全(JDK1.1老版本开始出现)

(8)、了解一下Thread类基本方法

  Thread t;

  t.getName(name);

  t.getId();

  t.setName();

  t.setPriority(newPriority);

  t.getPriority();

  Thread.MAX_PRIORITY

  Thread.MIN_PRIORITY

  Thread t=Thread.currentThread();//获取当前线程的优先级

  Thread.sleep();

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java基础知识随身记
2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这