zoukankan      html  css  js  c++  java
  • Java Thread And Runnable

    进程:它是程序的一次动态执行过程,它需要经历从代码加载,到代码执行,到执行完毕的一个完整过程,这个过程也是进程从产生、发展到最终消亡的过程。

    线程:线程是比进程更小的执行单位,它是在进程的基础上进一步划分,所谓多线程,是指一个进程在执行的过程可以产生多个更小的程序单元,这些更小的单元-称为线程。这些线程可以同时存在,同时运行,一个进程可能产生多个同时执行的线程。

    ----------

    java中进程的实现:

    1、继承Thread类实现多线程:

     1 package com.dyj.test;
    2
    3 public class TestThread extends Thread {
    4
    5 private String myName;
    6
    7 public TestThread(String myName) {
    8 this.myName = myName;
    9 }
    10
    11 public void run() {
    12 for (int i = 0; i < 5; i++) {
    13 System.out.println("运行了线程" + this.myName + "--" + i);
    14 }
    15
    16 }
    17
    18 public static void main(String[] args) {
    19 TestThread testThread1 = new TestThread("a");
    20 TestThread testThread2 = new TestThread("b");
    21
    22 testThread1.start();
    23 testThread2.start();
    24 }
    25
    26 }

    运行结果(随机的):

        运行了线程a--0
        运行了线程a--1
        运行了线程a--2
        运行了线程a--3
        运行了线程b--0
        运行了线程b--1
        运行了线程b--2
        运行了线程b--3
        运行了线程b--4
        运行了线程a--4

    另外一次:

        运行了线程b--0
        运行了线程b--1
        运行了线程a--0
        运行了线程b--2
        运行了线程a--1
        运行了线程b--3
        运行了线程b--4
        运行了线程a--2
        运行了线程a--3
        运行了线程a--4

    从以上结果可以看出,两个线程的运行时交替的,那个线程先抢到CPU资源,哪个线程就可以运行,所以程序每次运行的结果都不一样,在线程启动的过程中,虽然调用的是start()方法,但是真正的运行的是run()方法定义的主体。

    当重复的调用一个已经启动的线程-即重复的调用start方法:会抛出以下的异常信息

    java.lang.IllegalThreadStateException
        at java.lang.Thread.start(Thread.java:595)
         at com.dyj.test.TestThread.main(TestThread.java:23)

    2、实现Runnable接口实现多线程:

     1 package com.dyj.test;
    2
    3 public class TestThread implements Runnable {
    4
    5 private String myName;
    6
    7 public TestThread(String myName) {
    8 this.myName = myName;
    9 }
    10
    11 public void run() {
    12 for (int i = 0; i < 5; i++) {
    13 System.out.println("运行了线程" + this.myName + "--" + i);
    14 }
    15
    16 }
    17
    18 public static void main(String[] args) {
    19 TestThread testThread1 = new TestThread("a");
    20
    21
    22 Thread t1 = new Thread(testThread1);
    23 Thread t2 = new Thread(testThread1);
    24
    25 t1.start();
    26 t2.start();
    27 }
    28
    29 }

    (注意:由于Runnable接口没有定义start方法,而在Thread类中,定义了一个构造器,可以传递Runnable的实现类,实例化一个Thread,调用它的start方法,进行线程的启动)

    运行结果和继承Thread类结果类似,都是随机的结果,哪个线程抢到了CPU,就执行哪个类的线程。

    实际上:继承Thread类和实现Runnable接口石油区别的,如果一个类继承Thread,则不适合于多个线程共享资源,相反如果一个类实现了Runnable接口,则可以实现资源的共享:因为可以

    Thread t1 = new Thread(testThread1);
    Thread t2 = new Thread(testThread1);
    Thread t3 = new Thread(testThread1);
    testThread1的属性可以实现共享。
    ---------------------------
    线程的同步:所谓同步就是指多个操作,在同一个时间段内,只有一个线程可以运行,其他线程,要等待此线程执行完毕后,才可以继续执行,
    1、同步代码块:是指用{}括起来的一段代码,根据其位置的不同:分为普通代码块,构造块,静态块,如果在代码块前面加上syschroized关键字,则此代码块,就称为同步代码块:语法如下:
    syschroized(同步对象){
    需要同步的代码

    一般同步对象为this

    syschroized(this){
      需要同步的代码
    2、同步方法。是指在返回值或者void前面添加关键字syschroized即可,就可以将该方法声明为同步方法:
    线程的同步是以牺牲时间为代价的。
     
    I believe that we are who we choose to be. Nobody‘s going to come and save you, you‘ve got to save yourself. 我相信我们成为怎样的人是我们自己的选择。没有人会来拯救你,你必须要自己拯救自己。
  • 相关阅读:
    CSS 按类查看的常用样式属性
    html5前端准备资料
    编译和链接一些错误和警告
    [转]assert()函数用法总结
    [转]C++ 函数模板特化导致的多重定义链接错误
    [转]退出线程的几种方法
    [总结]编程中遇到的vc提示的一些警告
    [转]__declspec(dllexport) 和 __declspec(dllimport)
    [转]PROCESS_INFOMATION
    [转载] STARTUPINFO结构体
  • 原文地址:https://www.cnblogs.com/caroline/p/2389440.html
Copyright © 2011-2022 走看看