java基础---线程一

本文详细介绍了Java多线程的基本概念、线程的创建与使用方法,并通过实例展示了如何实现多线程间的交替运行及停止线程的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


学习笔记 -  Thread

一、线程简介

* 进程:是一个正在执行中的程序
 *    每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
 *
 * 线程:就是进程中的一个独立的控制单元。
 *    线程在控制着进程的执行。
 *
 * 一个进程中至少有一个线程
 * @author Administrator
 *
 * java有两个进程:编译进程和运行进程
 *
 * Java VM 启动的时候会有一个进程java.exe
 *
 * 该进程中至少有一个线程负责java程序的执行。
 * 而且这个线程运行的代码存在于main方法中
 * 该线程称之为主线程
 *
 *扩展:其实更细的说明虚拟机:启动vm不止一个线程,还有负责垃圾回收机制的线程
 *下载:多线程
 *
 *1.如何在自己的代码中自定义自己的线程
 * java已经提供了对线程这类事物的描述,就是Thread类
 *
 * 创建线程的第一种方式,继承Thread
 * 1. 继承Thread
 * 2. 复写run方法
 *       目的:将自定义的代码存储在run方法中,让线程运行。
 * 3. 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
 *   该方法两个作用:启动线程,调用run方法
 *
 * 每次运行结果都不同
 * 因为多个线程都获取cpu的执行权。cup执行到谁,谁就执行
 * 明确一点,在某一个时刻,只能有一个程序在运行。
 * cpu在做着快速的切换,以达到看上去是同时运行的效果。
 * 我们可以想象的把多线程在运行行为在互相强度cup的执行权
 *
 * 这就是多线程的一个特性:随机性,谁抢到执行谁,至于执行多长时间,cpu说了算
 *
 *为什么要覆盖run方法呢?
 *
 *Thread类用于描述线程。
 *该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。
 *
 *也就是说Thread类中的run方法,用于存储线程要运行的代码。

 

二、线程初步使用示例

 

public class ThreadDemo {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Demo d = new Demo();
  d.start();//开启线程并执行线程的run方法
  //d.run();//仅仅是对象调用方法,而线程创建了,没有运行。
  for(int i=0;i<60;i++)
  System.out.println("你好---"+i);
 }

}
//复写run,执行子类要执行的方法
class Demo extends Thread{
 @Override
 public void run() {
 for(int i = 0;i<60;i++){
  System.out.println("Demo run:"+i);
 }
 }
}

 

三、线程使用示例二

 

* 创建两个线程,和主线程交替运行
 *
 * 原来线程都有自己默认的名字
 * Thread-编号  该编号从0开始
 *
 * static Thread currentThread():获取当前线程对象
 *
 * getName():获取线程名称
 *
 * 设置线程名称:setName或者构造函数  或者直接使用父类的构造函数直接传递名称
 *
 * 设置名称的意义:获取名称,判断当前运行的线程

public class ThreadDemo2 {

 public static void main(String[] args) {
  Test t1 = new Test("one");
  Test t2 =new Test("two");
  t1.start();
  t2.start();
  for(int i = 0;i<60;i++){
   System.out.println("nihao:"+i);
  }

 }

}
class Test extends Thread

 //private String name;
 Test(String name){
  //this.name = name;
  //使用父类的构造方法,传递名字
  super(name);
 }
 @Override
 public void run() {
  for(int i = 0;i<60;i++){
   
   //System.out.println("name:"+name+"..."+i);
//   System.out.println(Thread.currentThread().getName() == this.getName());
//   System.out.println(this.getName()+"...."+i);
   System.out.println(Thread.currentThread().getName() +"..."+i);
  }
 }
}

 

四、停止线程示例

 * stop方法已经过时。
 *
 * 如何停止线程?
 * 只有一种,run方法结束。
 * 开启多线程运行,运行代码通常是循环结构。
 *
 * 只要控制住循环,就可以让run方法结束,也就是线程结束。
 *
 * 特殊情况
 * 当线程处于冻结状态。
 * 就不会读取到标记,那么线程就不会结束。
 *
 * 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除。
 * 强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。

 

public class StopThreadDemo {

 public static void main(String[] args) {
  StopThread s = new StopThread();
  
  Thread t1 = new Thread(s);
  Thread t2 = new Thread(s);
  //Marks this thread as either a daemon thread or a user thread
  t1.setDaemon(true);//设置为守护线程
  t2.setDaemon(true);
  t1.start();
  t2.start();
  
  int num = 0;
  while(true){
  if(num++ == 60)
  {
   //s.changFlag();
   //没有下面两句话   让线程都处于等待状态
   t1.interrupt();
   t2.interrupt();
   break;
  }
  System.out.println(Thread.currentThread().getName()+"......"+num);
 }
 
  
 }

}
class StopThread implements Runnable{
 private boolean flag = true;
 @Override
 public synchronized void run() {
  if(flag){
   try {
    wait();
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    System.out.println(Thread.currentThread().getName()+"exception");
    flag = false;
    
   }
   System.out.println(Thread.currentThread().getName()+"。。。。。。。。。。。run");
  }
  
 }
 public void changFlag(){
  flag = false;
 }
 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值