java多线程(1):基础

本章的要点

1.线程的启动
2.如何使线程暂停
3.如何使线程停止
4.线程的优先级
5.线程安全相关问题

进程

进程是操作系统结构的基础,是一次程序的执行。是一个程序及其数据在处理机上顺序执行时发生的活动,是程序在一个数据集合上运行的过程,它是系统资源分配和调度的一个独立单位。
实现多线程有两种方式:1.一种是继承Thread类,另一种是实现Runnable接口。

1.继承Thread类

public class MyThread extends Thread{
    /**
     * 继承并重写run接口
     */
    @Override
    public void run(){
        super.run();
        System.out.println("MyThread");
    }
}
public class MyThreadTest {
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        myThread.start();//执行多线程myThread,实际运行的是MyThread的run方法
        //myThread.start();多次start时,报Exception in thread "main" MyThread java.lang.IllegalThreadStateException错误
        /**
         *  打印MyThread,然后打印运行结束
         *  这可以说明代码的运行结果与代码执行或者调用顺序是无关的。
         */
        System.out.println("运行结束");
    }
}

运行结果:打印MyThread,然后打印运行结束,这可以说明代码的运行结果与代码执行或者调用顺序是无关的。

2.实现Runnable接口

/*
  1。实现多线程的另一种方式,实现接口
 */
public class Myrunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("运行中。。。。");
    }
}
public class MyrunnableTest {
    public static void main(String[] args){
        Runnable runnable = new Myrunnable();
        Thread thread = new Thread(runnable);
        thread.start();
        System.out.println("运行结束");
        //运行结果:1。运行结束     2。运行中。。。。
    }
}

运行结果:1。运行结束 2。运行中。。。。

进程

  • 线程不共享数据
public class noShareThread extends Thread {
    private int count = 5;
    public noShareThread(String name){
        super();
        this.setName(name);//设置线程名
    }
    @Override
    public void run() {
        super.run();
        /**
         * 每个线程都有各自的变量count,count变量不共享。
         */
        while (count > 0){
            count--;
            System.out.println("由" + this.currentThread().getName()
            + "计算,count" + count);
        }
    }
}
public class noShareThreadTest {
    public static void main(String[] args){
        noShareThread a = new noShareThread("A");
        noShareThread b = new noShareThread("B");
        noShareThread c = new noShareThread("C");
        a.start();
        b.start();
        c.start();
    }
}

运行结果

由A计算,count4
由A计算,count3
由A计算,count2
由A计算,count1
由A计算,count0
由B计算,count4
由B计算,count3
由B计算,count2
由B计算,count1
由B计算,count0
由C计算,count4
由C计算,count3
由C计算,count2
由C计算,count1
由C计算,count0
  • 线程数据共享
public class randomThread extends Thread {
    @Override
    public void run() {
        super.run();
        try {
            for (int i = 0 ; i < 10 ;i++){
                int time = (int)(Math.random() * 1000);
                Thread.sleep(time);
                System.out.println("run=" + Thread.currentThread().getName());
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}
public class yesShareThreadTest {
    public static void main(String[] args){
        yesshareThread shareThread = new yesshareThread();
        Thread a = new Thread(shareThread,"A");
        Thread b = new Thread(shareThread,"B");
        Thread c = new Thread(shareThread,"C");
        Thread d = new Thread(shareThread,"D");
        Thread e = new Thread(shareThread,"E");
        a.start();
        b.start();
        c.start();
        d.start();
        e.start();
    }
}

运行结果*

由B计算,count=3
由A计算,count=3
由C计算,count=2
由D计算,count=1
由E计算,count=0

从运行结果中可以看到,线程A和线程B的count值为3,因为A和B同时对count进行操作,产生线程不安全的操作。在run方法前面加上synchronized关键字,给run方法上锁。

public class yesshareThread extends Thread {
    private int count = 5;

    @Override
    synchronized public void run() {
        super.run();
        /**
         * 不要用循环语句,因为是共享的数据,要让其他的线程也能多count进行操作
         */
        count--;
        //currentThread()返回代码段正在被哪个线程调用的信息。
        System.out.println("由" + this.currentThread().getName()
                + "计算,count=" + count);
    }
}

再次运行结果*

由A计算,count=4
由B计算,count=3
由C计算,count=2
由D计算,count=1
由E计算,count=0

非线程安全主要是指多个线程中的同一个实例变量进行操作时会出现值被修改,值不同步的情况,进而影响程序的执行流程。

相关函数

  • currentThread()返回代码段正在被哪个线程调用的信息。
  • isAlive()方法判断当前的线程是否属于活动的状态。活动状态就是线程已经启动且尚未终止,线程处于正在运行或者开始运行的状态。
  • sleep()在指定的毫秒数内让当前"正在执行的线程"休眠(暂停执行)。
  • getId方法的作用是取得线程的唯一标识,获得线程的名称和id值。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,921评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,377评论 1 15
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • (原-2002-10-31) 请原谅我如此不敬,随处拈来两张纸给你写信。但那也可见我对你的怀恋是不分时地的了。 今...
    Ross高飞阅读 195评论 0 0
  • 离别伤感露真情 人生何处不相逢 待到山花烂漫时 把酒放歌对月明。
    那一片草原阅读 290评论 0 0