java中的线程

1.进程:一条动态执行的程序。

2、线程:进程可以近一步细化为线程。一个程序内部的一条执行路径就叫做线程。如果把进程比喻
成一座灰常大的王府,那么线程就是进出这座王府的一扇扇门。线程可以分为:用户线程、守护线程
和主线程。主线程我们一般是不需要考虑的。用户线程是jvm在非守护线程都结束后自动离开,而守
护线程是用来服务守护线程的。怎么说呢。。。当一个线程在所有其他的线程都结束以后仍然需要运
行,我们可以将这个线程设置为守护线程,用setDaemon(true)进行设置。在java中,析构函数是典型的守护线程。

3、线程的状态:新建状态、可运行状态、阻塞状态、等待状态、超时状态和终止状态。设置等待状态可以用个Thread t1=new Thread(new Program()).sleep("500")来进行设置,其中Program实现了Runnable的接口。Thread.yield()方法会暂停正在执行的线程的对象,将机会给更高优先级的或者是相同优先级的线程。

4、线程的同步:用synchronized关键字。synchronized(){}是同步块,()填的是一个唯一的地址变量,地址变量是唯一的一个,不可变更的。可以看成是一把锁,当有线程用了这把锁以后,那么别的线程就只能等待,不能重新的获取锁来打开这个同步块。

5、线程的加入:用t1.join()设置线程的加入。我发现了一个有趣的现象。先看下面的代码:
public class Program {
 public static void main(String[] args) {
  System.out.println("主线程开始。。。");
  System.out.println("主线程结束。。。");
  T1 t1 = new T1();
  Thread thread1 = new Thread(t1);
  thread1.setName("t1线程");
  thread1.start();

  T2 t2 = new T2();
  Thread thread2 = new Thread(t2);
  thread2.setName("t2线程");
  thread2.start();
  for (int i = 0; i < 500; i++) {
     System.out.println(Thread.currentThread().getName()+":"+i);

             if(i==100){
   try {
      thread1.join();  //这里设置了当i==100的时候thread1加入主线程
   } catch (InterruptedException e) {
       e.printStackTrace();
   }
     }
  }
 }
}
class T1 implements Runnable{

 public void run() {
    for (int i = 0; i < 500; i++) {
      System.out.println(Thread.currentThread().getName()+":"+i);

    }
 }
   }

class T2 implements Runnable{

   public void run() {
     for (int i = 0; i < 500; i++) {
 System.out.println(Thread.currentThread().getName()+":"+i);
     }
   }
}

当在主线程里i设置了100的条件时,thread1加入线程中,可是在运行的过程中,主线程到i==100时就不会执行了,而是thread1和thread2交替执行,当thread1全部执行完时,thread2和主线程才交替运行。这个和大神说的顺序执行可是不一样的,因为这里的子线程有两个,thread1是的确是和主线程顺序执行的,但是thread2还是可以和thread1交替执行的。

6、匿名:
    new Thread(new Runnable() {
       public void run() {
          for (int i = 0; i < 500; i++) {
             System.out.println("线程t1..."+i);
          }
       }
    }).start();

 new Thread(new Runnable() {
   public void run() {
     for (int i = 0; i < 500; i++) {
        System.out.println("线程t2..."+i); 
     }
   }
 }).start();
可以在程序中把线程写成这种形式,美其名曰:匿名

7.wait和notify是解决java中同步问题的重要方法,和synchronized结合使用。当synchronized方法或者是代码块中调用wait方法时,当前对象被终端运行,并且放弃该对象的锁。当另外的对象调用notify方法时会唤醒某个等待池中的某个对象,使之成为可运行的的线程。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值