Java多线程编程(一)Java多线程技能

  一、进程和多线程的概念以及线程的优点

  打开Windo任务管理器可以看到很多正在运行着的exe程序,完全可以将运行在内存中的exe文件理解成进程,进程是受操作系统管理的基本运行单元。

  线程可以理解成在进程中独立运行的子任务。比如,QQ.exe运行时就有很多的子任务在同时运行。

  使用线程,可以最大限度地利用CPU的空闲时间来处理其他的任务,CPU在人物之间不停地切换,由于切换速度非常快,所以人们感觉这些任务似乎在同时运行。也就是说看,可以在同一时间内运行更多不同种类的任务,可以大幅增加CPU的利用率。

  二、使用多线程

  一个进程正在运行时至少会有一个线程在运行。

1 package test;
2
3 public class Test {
4
5     public static void main(String[] args) {
6         System.out.println(Thread.currentThread().getName());
7     }
8
9 }

  输出为:main。这里输出的main其实就是一个名称叫做main的线程在执行main()方法中的代码。

  1.继承Thread类

  实现多线程编程的方式主要有两种:一种是继承Thread类,另一种是实现Runnable接口。从Thread类的结构来看,Thread类实现了Runnable接口,它们之间具有多台关系。为了支持多继承,完全可以实现Runnable接口的形式,一边实现一边继承。

  1.1线程的调用的随机性

1 public class MyThread extends Thread {
2     @Override
3     public void run() {
4         super.run();
5         System.out.println("MyThread");
6     }
7 }
 1 package test;
 2
 3 import com.mythread.www.MyThread;
 4
 5 public class Run {
 6
 7     public static void main(String[] args) {
 8         MyThread mythread = new MyThread();
 9         mythread.start();
10         System.out.println("运行结束");
11     }
12
13 }
运行结束
MyThread

  从输出结果可以看出,代码的运行结果与代码执行顺序或调用顺序是无关的,线程是一个子任务,CPU以不确定的方式,或者说是以随机的时间来调用线程中的run方法。

  1.2 演示线程的随机性

 1 package mythread;
 2
 3 public class MyThread extends Thread {
 4     @Override
 5     public void run() {
 6         try {
 7             for (int i = 0; i < 10; i++) {
 8                 int time = (int) (Math.random() * 1000);
 9                 Thread.sleep(time);
10                 System.out.println("run=" + Thread.currentThread().getName());
11             }
12         } catch (InterruptedException e) {
13             e.printStackTrace();
14         }
15     }
16 }
 1 package test;
 2
 3 import mythread.MyThread;
 4
 5 public class Test {
 6     public static void main(String[] args) {
 7         try {
 8
 9             MyThread thread = new MyThread();
10             thread.setName("myThread");
11             thread.start();
12
13             for (int i = 0; i < 10; i++) {
14                 int time = (int) (Math.random() * 1000);
15                 Thread.sleep(time);
16                 System.out.println("main=" + Thread.currentThread().getName());
17             }
18         } catch (InterruptedException e) {
19             e.printStackTrace();
20         }
21     }
22 }
main=main
main=main
run=myThread
main=main
run=myThread
run=myThread
main=main
main=main
run=myThread
main=main
main=main
run=myThread
main=main
main=main
run=myThread
run=myThread
run=myThread
main=main
run=myThread
run=myThread

  从输出的20个结果可以看出,Thread.java类中的start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。这个过程其实就是让系统安排一个时间来调用Thread中的run()方法,也就是使线程得到运行,启动线程,具有异步执行的效果。

  1.3 同步执行

  如果调用thread.run()方法就不是异步执行了,而是同步,那么此线程对象并不交给“线程规划器”来进行处理,而是由main主线程来调用run()方法,也就是必须等run()方法中的代码执行完后才可以执行后面的代码。

 1 package extthread;
 2
 3 public class MyThread extends Thread {
 4
 5     private int i;
 6
 7     public MyThread(int i) {
 8         super();
 9         this.i = i;
10     }
11
12     @Override
13     public void run() {
14         System.out.println(i);
15     }
16
17 }
 1 package test;
 2
 3 import extthread.MyThread;
 4
 5 public class Test {
 6
 7     public static void main(String[] args) {
 8         MyThread t11 = new MyThread(1);
 9         MyThread t12 = new MyThread(2);
10         MyThread t13 = new MyThread(3);
11         MyThread t14 = new MyThread(4);
12         MyThread t15 = new MyThread(5);
13         MyThread t16 = new MyThread(6);
14         MyThread t17 = new MyThread(7);
15         MyThread t18 = new MyThread(8);
16         MyThread t19 = new MyThread(9);
17         MyThread t110 = new MyThread(10);
18         MyThread t111 = new MyThread(11);
19         MyThread t112 = new MyThread(12);
20         MyThread t113 = new MyThread(13);
21
22         t11.start();
23         t12.start();
24         t13.start();
25         t14.start();
26         t15.start();
27         t16.start();
28         t17.start();
29         t18.start();
30         t19.start();
31         t110.start();
32         t111.start();
33         t112.start();
34         t113.start();
35
36     }
37
38 }
2
3
1
4
5
7
6
8
10
9
11
12
13

  从输出结果可以看出,start()方法的顺序并不代表线程启动的顺序。

  2.实现Runnable接口

  如果想要创建的线程类已经有一个父类了,这时就不能再继承自Thread类了,因为Java不支持多继承,所以就需要实现Runnable接口。

1 package myrunnable;
2
3 public class MyRunnable implements Runnable {
4     @Override
5     public void run() {
6         System.out.println("myrunnable类中的run!");
7     }
8 }
 1 package test;
 2
 3 import myrunnable.MyRunnable;
 4
 5 public class Run {
 6
 7     public static void main(String[] args) {
 8         Runnable runnable=new MyRunnable();
 9         Thread thread=new Thread(runnable);
10         thread.start();
11         System.out.println("run中的main!");
12     }
13
14 }
run中的main!
myrunnable类中的run!

  Thread.java类的8个构造函数中,有两个可以传递Runnable接口的对象,并且由于Thread类也实现了Runnable接口,所以也就意味着构造函数Thread(Runnable target)不光可以传入Runnable接口的对象, 还可以传入一个Thread类的对象,这样做完全可以将一个Thread对象中的run()方法交由其他的线程进行调用。

  3.实例变量与线程安全

  自定义线程类中的实例变量针对其他线程可以有共享与不共享之分。

  3.1 不共享数据

  3.2 共享数据

  4.留意i--与System.out.println()的异常

  三、currentThread()方法

  四、isAlive()方法

  五、sleep()方法

  六、getId()方法

  七、停止线程

  1.停止不了的线程

  2.判断线程是否是停止状态

  3.能停止的线程--异常法

  4.在沉睡中停止

  5.能停止的线程--暴力停止

  6.方法stop()与java.lang.ThreadDeath异常

  7.释放锁的不良后果

  8.使用return停止线程

  八、暂停线程

  1.suspend与resume方法的使用

  2.suspend与resume方法的缺点--独占

  3.suspend与resume方法的缺点--不同步

  九、yield()方法

  十、线程的优先级

  1.线程优先级的继承特性

  2.优先级具有规则性

  3.优先级具有随机性

  4.看谁运行得快

  十一、守护线程

原文地址:https://www.cnblogs.com/BigJunOba/p/8979164.html

时间: 2024-10-28 16:12:33

Java多线程编程(一)Java多线程技能的相关文章

(1)Java多线程编程核心——Java多线程技能

1.为什么要使用多线程?多线程的优点? 提高CPU的利用率 2.什么是多线程? 3.Java实现多线程编程的两种方式? a.继承Thread类 public class MyThread01 extends Thread {     @Override     public void run() {         super.run();         System.out.println("MyThread01");     } public static void main(S

Java多线程编程核心技术(三)多线程通信

线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督.在本章中需要着重掌握的技术点如下: 使用wait/notify实现线程间的通信 生产者/消费者模式的实现 方法join的使用 ThreadLocal类的使用 1.等待 / 通知机制 通过本节可以学习到,线程与线程之间不是独立的个体,它们彼此

多线程编程、Java I/O系统和Java图形界面编程

多线程编程: 一个正在运行的程序通常称为一个进程,每一个任务称为一个线程,中能够在一个程序内运行多线程的程序称为多线程程序. 线程与进程的区别:①每个进程都需要操作系统为其分配独立的内存空间: ②而同一个进程中的所有线程都在同一内存空间工作,这些线程可以共享同一块内存和系统资源. 线程的创建: 1)通过继承Thread类来创建线程: ①创建一个继承Thread类的类: ②在创建的Thread子类中重写run()方法,在方法中写入想要线程运行的代码: ③创建Thread子类的实例: ④通过调用该实

java并发编程12.java内存模型

假设一个线程为变量赋值:variable = 3: 内存模型需要解决一个问题:“在什么条件下,读取variable的线程将看到这个值为3?” 这看上去理所当然,但是如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远,看到另一个线程的操作结果. 如: 1.在编译器中生成的指令顺序,可以与源代码中的顺序不同,此外编译器还会将变量保存在寄存器而不是内存中: 2.处理器可以采用乱序或并行等方式来执行指令: 3.缓存可能会改变将写入变量提交到主内存的次序: 4.而且保存在处理器本地缓存中的值,对于其

3.java并发编程艺术-java内存模型

3.1 java内存模型的基础 3.1.1并发编程模型的两个关键问题 在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体).通信是指两个线程 之间以何种机制来交换信息.在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递. 在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信.在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来进行显式进行通信. 同步是指程序中用于控制不同线程

4.java并发编程艺术-java并发编程基础

java从诞生开始就明智的选择了内置对多线程的支持,这使得java语言相比同一时期的其他语言具有明显的优势.线程作为操作系统调度的最小单元,多个线程能够同时执行,这将显著提升程序的性能,在多核环境中表现的更加明显.但是,过多的创建线程和对线程的不当管理也容易造成问题.本章将着重介绍java并发编程的基础知识,从启动一个线程到线程间不同的通信方式,最后通过简单的线程池示例以及应用(简单的Web服务器)来串联本章所介绍的内容. 1.线程简介 1.1 什么是线程 现代操作系统中在运行一个程序时,会为其

Java并发编程:Java中的锁和线程同步机制

锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作.Java中的乐观锁基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败. 悲观

Java数据库编程、Java与XML解析技术

Java数据库编程: 1. JDBC概述:JDBC(数据库连接)是Java中提供的一套数据库编程API,它定义了一套用来访问数据库的标准Java类库(位于java.sql和javax.sql包中).用JDBC开发的数据库  应用既可以跨操作系统平台,又可以跨数据库系统平台.    在JDBC的基本操作中,最常用的类和接口包括DriverManager,  Connection,  Statement,  PreparedStatement,  CallableStatement 和 Result

Socket多线程编程 serversocket服务器多线程编程

服务器代码 package com.lotus.server; import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.ServerSocket;

Java语言编程 - 搭建Java开发环境

2.1 JDK.JRE和JVM关系 要弄清楚JDK.JRE和JVM这三者之间的关系,先看如下图,有个感性的认识: JDK:Java Development ToolKit(Java开发工具包).JDK是整个Java的核心,包括了JRE,一堆Java工具(javac/java/jdb等)和Java基础的类库. JRE:Java  Runtime  Enviromental(Java运行时环境).也就是我们说的Java平台,所有的Java程序都要在JRE下才能运行.包括JVM和Java核心类库和支持