Java多线程
Posted 菜菜小谭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程相关的知识,希望对你有一定的参考价值。
***********************第14章 多线程 **********************************
一.why
想让 两段代码 同时执行 的时候使用多线程
public static void main(String[] args){
//游戏开始
//游戏主体
//计时
while(true){
Thread.sleep(1000);//每睡一秒钟
//换一张数字的图片
}
}
二.what 基本概念
1. 进程: 程序的一次运行叫做一个进程.程序运行至少包含一个进程,也可以包含多个进程.
2. 线程: 程序中不同的执行路径,每一条执行路径叫做一个线程.一个进程至少包含一个线程,
也可以包含多个线程
3. 多进程: 操作系统可以同时执行多个任务(QQ、Word、桌面共享程序等)
4. 多线程: 一个程序中有多条不同的执行路径,而且多条执行路径同时执行..叫做多线程
注意: 分支不是多线程,始终只能走其中的一条路径
***********************************线程和进程的区别(面试题)********************************
一.从定义上来说
进程: 程序的一次运行叫做一个进程. ..
线程: 程序中的不同的执行路径...
二.从系统开销上来说
进程: 启动一个进程开销比较大
java HelloWorld
java Hello
虚拟机会为这个进程分配5份内存空间
(1) 虚拟机栈(简称栈)
(2) 堆
(3) 方法区(静态区)
(4) 本地方法栈
java 语言可以调用c语言 来实现某些功能...c语言的程序执行的时候 使用的栈叫做本地方法栈
核心技术 卷2 高级特性
(5) PC 程序计数器 Program Counter
存的是下一条指令的地址
**线程:开销小
启动一个新的线程只会为该线程分配一个 虚拟机栈...,多个线程是共用一个堆和方法区的...
***********************操作系统知识补充----进程管理(进程调度算法)*********************
进程管理研究的是 CPU如何分配
1. FCFS
First Come First Service 先来先服务
先运行的程序 先使用CPU
超市买东西 排在前面的 应该先结账 走人
2.短进程优先
使用CPU时间短的进程 优先使用CPU
超市买东西 只买一个牙膏的哥们 先结账 走人
3.时间片轮转
以使用时间为单位 比如50ms 为一个时间片
让每个进程都各自使用一个时间片的时间,该进程使用完毕以后,让下一个进程使用cpu
4.优先级高者优先
单核CPU 是真正的多线程吗??
不是...只有多核CPU才是真正的多线程...
***********************操作系统的五大管理*********************
1. 进程管理
管理CPU如何分配的
2. 内存管理
3. 设备管理(外部设备 打印机)
4. 文件管理 (研究的是 数据如何在外存中存储 硬盘 光盘)
5. 作业管理 (管理用户提交的任务 如何执行)
***********************实现多线程的两种方式(面试题)**********************************
一.继承Thread
1. 继承Thread类 重写run()方法
2.
//二.新建一个MyThread类的对象
MyThread t1 = new MyThread();
3.
//三.调用thread对象的start()来启动一个线程
//注意: 启动一个线程 使用的start()方法 而不是run()方法
//调用run()方法不是线程启动 而是方法调用
t1.start();
二.实现Runnable接口
1. 实现 Runnable接口 实现run()方法
MyRunnable r = new MyRunnable();
Thread t1 = new Thread(r,"线程1");
Thread t2 = new Thread(r,"线程2");
//三.调用thread对象的start()方法启动一个线程
t1.start();
t2.start();
两种方式 推荐使用 第二种---实现Runnable接口这种
因为java是单继承,如果使用第一种继承Thread类这种方式,线程类就不能再继承其他类了,所以推荐使用第二种方式..
public class Thread{
private Runnable target;
public Thread(Runnable target){
this.target = target;
}
}
***************************************同步问题*************************************
多个线程 访问 共享资源的时候 会出现同步问题(数据不一致、数据错误的情况 同步问题)
如何解决同步问题:
1. 同步方法
在方法上加锁 把this当锁
public void synchronized test(){
}
2. 同步代码块
synchronized(this){
//访问共享资源的代码
}
加锁了以后效率会低,因为要等着前一个线程执行完毕 释放锁以后 后面的线程 才能继续执行...
演示代码:
package com.chapter14.演示同步问题;
import java.util.Date;
//使用第二种方式 如果两个线程对象 使用的都是同一个Runnable对象 数据是可以共享的
public class MyRunnable implements Runnable {
private int sum = 8000;
@Override
public void run() {
withdraw();
}
//一.同步方法
//在方法上加了一把锁
//以this为锁 1 开
public void withdraw(){
//1---------->0 锁上
System.out.println("withdraw");
synchronized(this){
if(5000<=sum){
//模拟时间片恰好使用完毕的情况
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
sum = sum - 5000;
System.out.println("吐5000");
System.out.println("您的余额是:" + sum);
}else{
System.out.println("余额不足");
}
}
//0-------------->1打开
}
public static void main(String[] args) {
//二.
MyRunnable r = new MyRunnable();
Thread t1 = new Thread(r,"线程1");
Thread t2 = new Thread(r,"线程2");
t1.start();
t2.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
以上是关于Java多线程的主要内容,如果未能解决你的问题,请参考以下文章