JAVA多线程的学习笔记

第一次在开源中国上发博文,简单的把以前在达内培训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<String> nameList = new ArrayList<String>();

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<String> nameList = new ArrayList<String>();

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();

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

java基础知识随身记

2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类

JAVA多线程的学习笔记 - HelloWorld