1.进程 :
    (一)正在执行的程序称作为一个进程。 进程负责了内存空间的划分。

(二)问题: windows号称是多任务的操作系统,那么windows是同时运行多个应用程序吗?

从宏观的角度: windows确实是在同时运行多个应用程序。

从微观角度: cpu是做了一个快速切换执行的动作,由于速度态度,所以我感觉不到在切换 而已。

2.线程:
     线程的优先级默认是5;
    (一)线程在一个进程 中负责了代码的执行,就是进程中一个执行路径,

(二)多线程: 在一个进程中有多个线程同时在执行不同的任务。

(三)提问 :a.代码的执行是线程负责的,那么他的执行过程?

运行任何一个java程序,jvm在运行的时候都会创建一个main线程执行main方法中所有代码。

b.一个java应用程序至少有几个线程?

至少有两个线程, 一个是主线程负责main方法代码的执行,一个是垃圾回收器线程,负责了回收垃圾。

(四)多线程的好处:
              1.解决了一个进程能同时执行多个任务的问题。
              2. 提高了资源的利用率。

(五)多线程 的弊端:
              1. 增加cpu的负担。
              2. 降低了一个进程中线程的执行概率。
              3. 引发了线程安全 问题。
              4. 出现了死锁现象。

(六)如何创建多线程:

a.创建线程的方式:

方式一:
                         1. 自定义一个类继承Thread类。
                         2. 重写Thread类的run方法 , 把自定义线程的任务代码写在run方法中
                         疑问: 重写run方法的目的是什么?
                                   每个线程都有自己的任务代码,jvm创建的主线程的任务代码就是main方法中的所有代码, 自定义                                    线程的任务代码就写在run方法中,自定义线程负责了run方法中代码。
                         3. 创建Thread的子类对象,并且调用start方法开启线程。

注意:一个线程一旦开启,那么线程就会执行run方法中的代码,run方法千万不能直接调用,直接调用                                       run方法就相当调用了一个普通的方法而已并没有开启新的线程。

方式二:推荐用这个因为java是单继承,多实现的;这就比较好了

1.自定义类实现Runnable接口的run方法

2.再通过创建Thread对象将实现Runable接口类作为实参传给Thread

3.线程在start()即可

public class test04 implements Runnable{

    public static void main(String[] args) {
// TODO Auto-generated method stub
test04 t=new test04();
Thread b=new Thread(t,"小平");
b.start();
for(int i = 0 ; i < 10 ; i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
} @Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
} }

(七)创建多线程例子

public class MyThread extends Thread{
@override//重写Thread的run方法,再调用这个自定义的线程
public void run(){
for(int i=0;i<10;i++){
System.out.println("自定义线程:"+i);
}
}
public static void main(String[] args){
//创建自定义的线程类
Demo d=new Demo();
//调用start方法启用线程,不能通过d.run()方法调用,这样没有启动线程
d.start(); for(int i=0;i<10;i++){
System.out.println("主线程:"+i);
}
} }

  

(八)线程安全(很重要)
              a.多线程售票,出现几个线程一起到达莫个位置出现的问题这就是线程安全问题
              b.解决办法:出现线程安全原理是多个线程同时访问代码块内部不该同时访问的位置,我们让那部分代码成为一个                                整 体一次只能给一个线程访问,就解决问题了
                               出现线程安全问题的根本原因:
                                    1. 存在两个或者两个以上 的线程对象,而且线程之间共享着一个资源。
                                    2. 有多个语句操作了共享资源
                  方式一:同步代码块
                                  synchronized(锁对象){
                                            需要被同步的代码...
                                  }
                              注意:1.任意一个对象都可以作为锁对象
                             原因:任意对象都可作为一个锁对象, 因为凡是对象内部都维护了一个状态,
                              Java的同步机制,就是将对象中的状态作为锁的标识
                              state=0:开;1关
                                       2.在同步代码块中调用sleep方法并不是释放对象
                                       3.只有真正需要同步代码块时,否则会降低效率
                                       4.多线程操作的锁对象,必须是唯一共享,否则无效
             c.例子:一个银行账户5000块,两夫妻一个拿着 存折,一个拿着卡,开始取钱比赛,每次只能取一千块,要求不准                          出现线程安全问题。

class SaleTicket extends Thread{

     static int num = 50;//票数  非静态的成员变量,非静态的成员变量数据是在每个对象中都会维护一份数据的。

     static    Object o = new Object();

     public SaleTicket(String name) {
super(name);
} @Override
public void run() {
while(true){
//同步代码块
synchronized ("锁") {
if(num>0){
System.out.println(Thread.currentThread().getName()+"售出了第"+num+"号票");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
num--;
}else{
System.out.println("售罄了..");
break;
}
} }
} } public class Demo4 { public static void main(String[] args) {
//创建三个线程对象,模拟三个窗口
SaleTicket thread1 = new SaleTicket("窗口1");
SaleTicket thread2 = new SaleTicket("窗口2");
SaleTicket thread3 = new SaleTicket("窗口3");
//开启线程售票
thread1.start();
thread2.start();
thread3.start(); } }

3.死锁

经典的“哲学家就餐问题”,5个哲学家吃中餐,坐在圆卓子旁。每人有5根筷子(不是5双),每两个人中间放一根,哲学家时而思考,时而进餐。每个人都需要一双筷子才能吃到东西,吃完后将筷子放回原处继续思考,如果每个人都立刻抓住自己左边的筷子,然后等待右边的筷子空出来,同时又不放下已经拿到的筷子,这样每个人都无法得到1双筷子,无法吃饭都会饿死,这种情况就会产生死锁:每个人都拥有其他人需要的资源,同时又等待其他人拥有的资源,并且每个人在获得所有需要的资源之前都不会放弃已经拥有的资源。

(一):当多个线程完成功能需要同时获取多个共享资源的时候可能会导致死锁

(二):死锁没有解决办法,只能尽量避免

java入门了解06的更多相关文章

  1. Java入门 - 面向对象 - 06.接口

    原文地址:http://www.work100.net/training/java-interface.html 更多教程:光束云 - 免费课程 接口 序号 文内章节 视频 1 概述 2 接口的声明 ...

  2. 061 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 08 一维数组总结

    061 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 08 一维数组总结 本文知识点:一维数组总结 总结 注意点

  3. 060 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 07 冒泡排序

    060 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 07 冒泡排序 本文知识点:冒泡排序 冒泡排序 实际案例分析冒泡排序流程 第1轮比较: 第1轮比较的结果:把最 ...

  4. 059 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 06 增强型for循环

    059 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 06 增强型for循环 本文知识点:增强型for循环 增强型for循环格式 案例练习增强型for循环 数组名字 ...

  5. 058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值

    058 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 05 案例:求数组元素的最大值 本文知识点:求数组元素的最大值 案例:求数组元素的最大值 程序代码及其执行过程 ...

  6. 057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和

    057 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 04 案例:求整型数组的数组元素的元素值累加和 本文知识点:求整型数组的数组元素的元素值累加和 案例:求整型数 ...

  7. 056 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 03 一维数组的应用

    056 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 03 一维数组的应用 本文知识点:数组的实际应用 程序开发中如何应用数组? 程序代码及其运行结果: 不同数据类 ...

  8. 055 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 02 数组的概念

    055 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 02 数组的概念 本文知识点:数组的概念 数组的声明创建.初始化 在学习数组的声明创建.初始化前,我们可以和之 ...

  9. 054 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 01 数组概述

    054 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 01 数组概述 本文知识点:数组概述 为什么要学习数组? 实际问题: 比如我们要对学生的成绩进行排序,一个班级 ...

随机推荐

  1. 教你用squid做CDN把公司做到上市

    我们都知道CDN(内容分发网络)是用来给网站加速用的,通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络的“边缘”,使用户可以就近取得所需的内容,以提高用户访问网站 ...

  2. org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

    © 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述 启动hibernate测试案例时报错如下: 2.解决方案: 2.1 第一次解决:MySQL驱动版本太高.使用的hibernate版本为5 ...

  3. root 执行过程权限问题

    mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法 权限问题,授权 给 root  所有sql ...

  4. Apache配置压缩优化时报错——undefined symbol: inflateEnd

    Apache配置压缩优化时报错——undefined symbol: inflateEnd 环境:CentOS 6.4 软件版本:httpd-2.4.6 apr-1.4.8 apr-util-1.5. ...

  5. codeforces 427 div.2 F. Roads in the Kingdom

    F. Roads in the Kingdom time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  6. 07 在Windows下编译Memcached

    一:windows下编译Memcached (1)下载地址dll:http://down.51cto.com/data/442606 (2)在php下输出 echo phpinfo():查看php的版 ...

  7. FreeSWITCH 学习笔记

    [1]FreeSWITCH学习笔记 1.Windows安装包下载地址:http://files.freeswitch.org/windows/installer/ 2.源码下载地址:http://fi ...

  8. DLX精确覆盖与重复覆盖模板题

    hihoCoder #1317 : 搜索四·跳舞链 原题地址:http://hihocoder.com/problemset/problem/1317 时间限制:10000ms 单点时限:1000ms ...

  9. 【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序

    [BZOJ4010][HNOI2015]菜肴制作 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高 ...

  10. ibatis中井号跟美元符号区别(#.$)

    1.#可以进行预编译,进行类型匹配,#变量名# 会转化为 jdbc 的 类型 $不进行数据类型匹配,$变量名$就直接把 $name$替换为 name的内容 例如: select * from tabl ...