多线程

数据库魔术师
• 阅读 1032

1.1并行和并发
并发:指两个事情在这个时间内一个一个的做。
并行:指一个时间内同时做多个事情。
总结:并发是有顺序的,并行是做多个事情。
1.2创建多线程
//继承Thread类来创建线程

public class ThreadTest {
    public static void main(String[] args) {
        //设置线程名字
        Thread.currentThread().setName("六尘一");
        MyThread myThread = new MyThread();
        myThread.setName("新的线程:");
        //开启线程
        myThread.start();
        for(int i = 0;i<10;i++){
            System.out.println(Thread.currentThread().getName() + i);
        }
    }
}
class MyThread extends Thread{
    //重写run()方法
    public void run(){
        for(int i = 0;i < 10; i++){
            System.out.println(Thread.currentThread().getName() + i);
        }
    }
}

会循环10个六尘一
总结:继承了Thread就没办法继承其它类了。
1.3:Thread接口与Runnble类的区别:
Runnnble可以使用共同资源。
线程池只能放入实现Runable接口或Callable类线程,不能直接放入继承Thread的类。

1.4线程和进程:
一个程序就是一个进程,而一个程序中的多个任务则被称为线程。
1.5线程安全:

package com.kjzz.Runnable;

public class Aicket implements Runnable{
    private int ticket = 100;

    /*
     * 执行卖票操作
     */
    @Override
    public void run() {
        //每个窗口卖票的操作
        //窗口 永远开启
        while (true) {
            if (ticket > 0) {//有票 可以卖
              
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto‐generated catch block
                    e.printStackTrace();
                }
                //获取当前线程对象的名字
                String name = Thread.currentThread().getName();
                System.out.println(name + "正在卖:" + ticket);
            }
        }
    }
}

package com.kjzz;

import com.kjzz.Runnable.Aicket;

public class Demo01 {
    public static void main(String[] args) {
        Aicket t = new Aicket();
        Thread thread = new Thread((Runnable) t,"窗口1");
        Thread thread1= new Thread((Runnable) t,"窗口2");
        Thread thread2 = new Thread((Runnable) t,"窗口3");
        thread.start();
        thread1.start();
        thread2.start();
    }
}

多线程
这里出现了不该有的票,比如-1和0要怎么解决呢,出现这种情况显然表明这个方法根本就不是线程安全的,出现这种问题的原因有很多
需要用到lock锁

package com.kjzz.Runnable;


import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Ticket implements Runnable {

    private int ticket = 10;
    Lock lock = new ReentrantLock();
    /*
     * 执行卖票操作
     */
    @Override
    public void run() {
        while(true){
           lock.lock();
            if(ticket>0){
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //获取当前线程对象的名字
                String name = Thread.currentThread().getName();
                System.out.println(name+"正在卖:"+ticket--);
            }
            lock.unlock();
        }
        }
    }

打了个lock锁就不会出现这种情况呢

点赞
收藏
评论区
推荐文章
九鹤 九鹤
4年前
并发编程的基础概念
什么是线程?什么是进程?java可以开启线程吗?不能因为Java无法直接操硬件,他是运行在虚拟机上面的,什么是并发?什么是并行?并发就是多个线程去操作一个资源。并行是多个线程同时行,但是操作的资源不是同一个。线程的六个状态new(诞生)runnable(运行)Blocked(阻塞)waiiiing(等待)Tiemwaiing(超时等待)
Wesley13 Wesley13
3年前
Java 多线程(一)—— 概念的引入
并发和并行并行:指两个或多个时间在同一时刻发生(同时发生);并发:指两个或多个事件在一个时间段内发生。  在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单CPU系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替
Wesley13 Wesley13
3年前
Go 并发
Go并发并发指的是同时处理多个任务的能力。并行指的是并行处理多个任务的能力。并行不一定加快运行速度,因为并行组件之间可能需要互相通信。Go中使用协程,信道来处理并发。协程Go中主要通过协程实现并发。协程是与其他函数或方法一起并发运行的函数或方法,协程可以看作是轻量级线程,但是创建成本更小,我们经常
Stella981 Stella981
3年前
Go中的并发编程和goroutine
并发编程对于任何语言来说都不是一件简单的事情。Go在设计之初主打高并发,为使用者提供了goroutine,使用的方式虽然简单,但是用好却不是那么容易,我们一起来学习Go中的并发编程。1\.并行和并发并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。并发(concurrency):指在
Wesley13 Wesley13
3年前
Go 中的并发和并行
并行是指同一时间做多件事情,并发是指同一时间具有做多件事情的能力。在很多情况下,并发的效果比并行好,因为操作系统的硬件资源和总资源是很少而且固定的,不能无限去扩张。Go语言设计的时候应该也是推崇这种使用较少资源做更多事情的哲学。并发执行Go语言中可以使用系统功能设置可以使用的物理处理器(核),如果设置为1的话,所有的协程会在一个核上
Wesley13 Wesley13
3年前
Java 之 多线程
一、并发与并行  1、并发指两个或多个事件在同一时间段内发生。  2、并行      指两个或多个事件在同一时刻发生(同时发生)。    !(https://oscimg.oschina.net/oscnet/b4e6bf7c5ec22bb8c38945fff7c188e6
Stella981 Stella981
3年前
Python并发(二)
并发是指一次处理多件事,而并行是指一次做多件事。二者不同,但互相有联系。打个比方:像Python的多线程,就是并发,因为Python的解释器GIL是线程不安全的,一次只允许执行一个线程的Python字节码,我们在使用多线程时,看上去像很多个任务同时进行,但实际上但一个线程在执行的时候,其他线程是处于休眠状态的。而在多CPU的服务器上,Java或Go的多线程,
Wesley13 Wesley13
3年前
Java总结:Java多线程
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。Java给多线程编程提供了内置的支持。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。这里定义和线程相关的另一个术语进程:一个进程包括由操作系统分配的内存空间,
Wesley13 Wesley13
3年前
Java线程与多线程
1线程与多线程1.1线程是什么?线程(Thread)是一个对象(Object)。用来干什么?Java线程(也称JVM线程)是Java进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。Java程序采用多线程方式来支持大量的并发请求处理,程序如果在
Wesley13 Wesley13
3年前
Selenium2 Python 自动化测试实战学习笔记(八)
Python多线程分布式和并行是完全不同的概念,分布式只负责将一个测试脚本可调用不同的远程环境来执行;并行强调“同时”的概念,它可以借助多线程或多进程技术并行来执行脚本技术。10.1单进程的时代        在单线程的时代,当处理器要处理多个任务时,必须要对这些任务排一下执行顺序并按照这个顺序
Wesley13 Wesley13
3年前
Java多线程介绍
1\.线程概述1.1线程和进程进程是处于运行过程中的程序,并且具有一定的独立功能并发性:同一个时刻只能有一条指令执行,但多个进程指令被快速轮换执行并行:多条指令在多个处理器上同时执行线程是进程的执行单元1.2多
数据库魔术师
数据库魔术师
Lv1
平凡且认真的生活总会变得可爱。
文章
4
粉丝
0
获赞
0