线程_基本

进程:正在运行的程序称作为一个进程。进程负责了内存空间的划分

windows号称是多任务的操作系统,那么windows是同时运行多个应用程序么?

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

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

单核的cpu在一个时间片中只能执行一个应用程序

各个应用程序其实是在做cpu资源争夺战

线程:负责代码的执行

多线程:在一个进程中有多个线程在执行不同的任务

线程负责了代码的执行,以前没有线程,为什么代码可移执行?

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

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

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

与其说是进程在做cpu的资源争夺战,不如说是线程在做cpu的资源争夺战

多线程的好处:

  1.解决了一个进程能同时执行多个任务的问题

  2.提高了资源的利用率(将没有用尽资源利用起来)

弊端:

  增加了CPU的负担

  降低一个进程中线程的执行概率

  会引发线程安全问题

  出现死锁现象

如何创建多线程:

  创建线程的方式:

   方式一:

    1.自定义一个类继承Tread类

    2.重写Thread类的run方法

      疑问:重写run方法的目的是什么?

    每个线程都有自己的任务代码,jvm创建的主线程的任务代码就是main方法中的所有代码,自定义线程的任务代码就写在run方法中,自定义线程负责了run方法中代码

    3.创建Thread的子类对象,并且调用start方法开启线程

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

    主线程和自定义线程是交替进行的

线程的生命周期:

cpu的等待资格

cpu的执行权

  创建状态(将线程类对象new出来时):没有cpu等待资格,没有cpu执行权

  (调用start方法)

  可运行的状态(具备等待cpu的资格,不具备cpu的执行权)

  (得到cpu的执行权,若被抢夺了cpu的执行权,返回上一状态)

  运行状态(具备cpu的执行权,也具备cpu的等待资格)

  (完成任务)

  死亡状态(没有cpu的等待资格,没有cpu执行权)

临时阻塞状态(运行状态下的线程,一旦执行了sleep或者waitfangfa之后,那么该线程会进入临时阻塞状态下,如果线程是调用了sleep进入阻塞状态,那么线程一旦超过了指定的睡眠时间,就会重新进入可运行状态,如果调用了wait方法进入临时阻塞状态,那么需要该线程唤醒其他线程才可以重新进入可运行状态)不具备等待资格

线程常用的方法

  thread(String name); 初始化线程的名字

  getName()  返回线程的名字

  setName(String name)  设置设置线程对象名

  sleep()  线程睡眠指定的毫秒数  是一个静态的方法 哪个线程执行了sleep方法,那么就是哪个线程睡眠

  getPriority()  返回当前线程的优先级 默认线程的优先级是5

  setPriority(int newPriority)  设置线程的优先级  虽设置了线程的优先级,但是具体的实现取决于底层的操作系统的实现(最大的优先级是10,最小的是1,默认为5)

  currentThread()  返回cpu正在执行的线程对象 该方法是一个静态方法,注意:哪个线程执行了currentThread()代码,就返回那个线程的对象

thread 子类 的run方法为什么不能抛出异常?

  因为thread类的run方法没有抛出异常,所以继承父类的子类也不能抛出异常,run方法属于重写,重写的方法抛出的异常要小于或者等于父类抛出的异常

非静态的成员变量,非静态的成员变量数据是在每个对象中都会维护一份数据的

在什么情况下会出现线程安全问题:

  1.存在两个或者两方以上的线程,并且线程之间共享一个数据资源

  2.有多个语句操作共享资源

多线程的好处:

  1.解决了一个进程中可以同时执行多个任务的问题

  2.提高了资源的利用率

多线程的弊端:

  1.增加了cpu的负担

  2.降低了一个进程中线程的执行效率

  3.出现了线程安全问题

  4.会引发死锁现象

线程安全问题的解决方案:sun提供了线程同步机制让我们解决这类问题

  java线程同步机制的方式:

    方式一:同步代码块:

      同步代码块的格式:

        synchronized(锁对象){

        需要被同步的代码  

        }

  同步代码块要注意的事项:

    1.锁对象可以是任意的一个对象,

      任意的对象都可以作为锁对象。凡是对象内部都维护了一个状态的,java同步机制就是使用了对象中的状态作为了锁的标识  (用一个字符串也可以锁住)

    2.在同步代码块中调用了sleep方法并不释放锁对象

    3.只有真正存在线程安全问题的时候才使用同步代码块,否则会降低效率

    4.多线程操作的锁对象必须是唯一共享的,否则无效  

  方式二:同步函数  使用synchronized修饰一个函数

    同步函数的注意事项:

      1.如果是一个非静态的同步函数的锁  对象是this对象  如果是静态的同步函数的锁  对象是当前函数所属的类的字节码文件(class对象)(在方法区创建一个对象后,系统将相应类进行分解,得到的方法属性封装到一个class对象上)

推荐使用:同步代码块

  原因:

    1.同步代码块的锁对象可以由我们随意指定,方便控制。同步函数的锁对象是固定的,不能由我们来指定。

    2.同步代码块可以很方便控制需要被同步代码的范围,同步函数必须是整个函数的所有代码都被同步了。

java中的同步机制,解决了线程中的安全问题,也同时引发了死锁现象

死锁现象 出现的根本原因::

  1.存在两个或者两个以上的线程

  2.存在两个或者两个以上的共享资源

死锁解决的方案:没有方案,只能尽量避免的发生

  

自定义线程的创建方式二:

  1.自定义一个类实现runnable接口

  2.实现Runnable接口的run方法,把自定义线程的任务定义在run方法上

  3.创建runnable的实现类对象,

  4.创建thread类的对象,并且把Runnable实现类的对象作为一个参数传递进行

  5.调用thread对象的start方法开启一个线程

问题1:请问runnable实现类的对象是线程对象吗?-------线程必须有start方法

  Runnable实现类的对象并不是一个线程对象,只不过是实现了Runnable接口的对象而已

  只有Thread及thread的对象才是属于线程对象

问题2:为什么要把runnable实现类的对象作为实参传递给Thread对象?作用是什么?

  作用是把Runnable实现类的对象的run方法作为了线程的任务代码去执行

自定义线程的创建,推荐第二种。实现Runnable接口的

原因:因为java是单继承多实现的

  

时间: 2024-10-26 16:05:04

线程_基本的相关文章

多线程_创建线程_继承Thread类

public class ThreadDemo {   public static void main(String[] args){         Demo d = new Demo();   d.start();      for(int i = 0;i < 100;i++){      System.out.println("MainThread" + i);   }   } } class Demo extends Thread {   public void run(

Lock锁_线程_线程域

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms; namespace Lock锁_线程_线程

10.5 android输入系统_Reader线程_使用EventHub读取事件和核心类及配置文件_实验_分析

4. Reader线程_使用EventHub读取事件 使用inotify监测/dev/input下文件的创建和删除 使用epoll监测有无数据上报 细节: a.fd1 = inotify_init("/dev/input") b.假设input下已经有了event0和event1 fd2 = open("/dev/input/event0") fd3= open("/dev/input/event1") c.使用epoll_wait监测fd1.f

java_有返回值线程_提前加载例子

package com.demo.test3; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /** * @author QQ: 1236897 * */ //有返回值线程 //提前加载 public class FutureTaskTest { /** * @param args */ pu

mysql查看当前执行线程_关闭当前的某些线程 show processlist_kill

每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止一个线程. 如果您拥有SUPER权限,您可以终止所有线程和语句.否则,您只能查看和终止您自己的线程和语句. 您也可以使用mysqladmin processlist和mysqladmin kill命令来检查和终止线程. 1.SHOW PROCESSLIST 2.kill 6 3.再次show processlist,可看到下图效果: 在多

PoEdu - Windows阶段班 【Po学校】Lesson006_线程_线程的启动到消亡 &amp;线程状态 &amp; 线程安全 &amp; CONTEXT结构体 &amp; 令牌锁

011_线程启动到死亡的详细讲解 1. 线程内核对象 使用计数 2 ##决定当前线程何时销毁 暂停计数 1 ##UINT类型初始为1,可以暂停多次,如置为0则取消暂停. 退出代码 STILL_ACTIVE Signaled FALSE CONTEXT 为空 2. 栈##在隶属于当前进程的空间中,分配一块"栈"空间,以供线程使用 参数 lpParam 入口地址 lpfnAddr 3. CONTEXT##线程上一次运行时的寄存器 IP(指令寄存器) void RtlUserThreadSt

10_控制线程_线程让步yield

[线程让步yield()方法] yield()方法可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程从运行状态转入就绪状态. 只是让当前的线程暂停一下,让系统的线程调度器重新调度一次. 很有可能,当某个线程调用了yield()方法暂停之后进入就绪状态,它又马上抢占了CPU的执行权,继续执行. [注意] 实际上,当某个线程调用了yield()方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的处于就绪状态的线程才会获得执行的机会. [示例代码] package com.

09_控制线程_线程睡眠sleep

[线程睡眠] 如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态方法sleep()方法来实现. sleep()方法有两种重载形式: 1.static void sleep( long millis ):让当前正在执行的线程暂停millis毫秒,并进入阻塞状态. 2.static void sleep( long millis,int nanos ):加上纳秒,很少使用该方法. 在当前线程调用sleep()方法进入阻塞状态后,在其睡眠时间段内,该线程不会获

08_控制线程_后台线程(守护线程)

[后台线程] 后台线程(Daemon Thread):运行在后台,他的任务是为其它的线程提供服务,又称为"守护线程".JVM的垃圾回收线程就是典型的后台线程. [ 特征 ] 如果所有的前台线程都死亡,后台线程会自动死亡. 调用Thread对象的setDaemon(true)方法可以将指定的线程设置成后台线程. 当整个虚拟机中只剩下后台线程时,程序就没有继续运行的必要了,所以虚拟机也就退出了. Thread类提供了一个isDaemon()方法,用来判断指定线程是否为后台线程. [示例代码