美文网首页
java多线程

java多线程

作者: onweer | 来源:发表于2016-02-07 01:18 被阅读39次

多线程

优点: 解决一个进程同时执行多个代码任务的问题


自定义线程

方法1: 继承Thread

  1. 自定义一个雷继承Thread
  2. 重写Threadrun()方法,多线程代码在run()中执行
  3. 创建Thread子类对象,并调用start()方法启动一个线程.
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + i);
        }
    }
}
class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(super.getName() + i);
        }
    }

Console

main0
Thread-00
main1
Thread-01
main2
Thread-02
main3

方法2: 实现Runnable接口

  1. 自定义一个类implements Runnable接口
  2. 实现Runnable接口中的run()方法,把自定义线程的任务代码定义在run()方法中
  3. 创建Runnable实现类的对象
  4. 创建Thread对象,并把Runnable实现类的对象作为参数传递
  5. 调用Thread对象的start()方法开启线程
public static void main(String[] args) {
        //MyThread myThread = new MyThread();
        //myThread.start();
        MyThread2  myThread2 = new MyThread2();
        Thread th = new Thread(myThread2);
        th.start();
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + i);
        }
    }
class MyThread2 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + i);
        }   
    }
}

Console

main0
Thread-00
main1
Thread-01
main2
Thread-02


线程安全

弊端:多个线程需要判断锁,较为消耗资源

线程安全出现问题原因:

1.必须存在两个或以上的线程共享着一个资源.
2.操作共享资源的代码必须有两句或者两句以上.

1.同步代码块

synchronized(对象){//这个对象可以是任意对象
//需要被同步的代码
//对象如同锁,持有锁的线程可以在同步中执行 
//没持有锁的线程即使获取CPU的执行权,也进不去 
}
    public static void main(String[] args) {
        //MyThread myThread = new MyThread();
        //myThread.start();
        MyThread2  myThread2 = new MyThread2();
        Thread th1 = new Thread(myThread2);
        Thread th2 = new Thread(myThread2);
        Thread th3 = new Thread(myThread2);
        Thread th4 = new Thread(myThread2);
        th1.start();
        th2.start();
        th3.start();
        th4.start();
    }
class MyThread2 implements Runnable{
    Object obj = new Object();
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            synchronized (obj) {
                System.out.println(Thread.currentThread().getName() +","+ i);
            }
            
        }   
    }
}

Console

Thread-0,0
Thread-0,1
Thread-0,2
Thread-2,0
Thread-2,1
Thread-2,2
Thread-1,0
Thread-1,1
Thread-1,2
Thread-3,0
Thread-3,1
Thread-3,2

2.同步函数

修饰符 synchronized 返回值类型 函数名(形参列表...){
}
class Bank{
    private int sum = 0;
    public synchronized void add(int a){//同步函数
        sum += a;
        try{
            Thread.sleep(40);
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println("sum = " + sum);
    }
}
class Client implements Runnable{
    private Bank b = new Bank();
    @Override
    public void run(){
        for (int i = 0; i < 3; i++) {
            b.add(100);
        }
    }
}
public class ThreadDemo2 {
    public static void main(String[] args) {
        Client c = new Client();
        Thread t1 = new Thread(c);  
        Thread t2 = new Thread(c);  

        t1.start();  
        t2.start();  
     
    }

注意 :

  1. 同步代码的锁,可以是任意对象Object,同步函数的锁,是固定的,非静态函数的锁对象是this ,静态函数的锁对象是class对象
  2. 同步锁对象必须是多线程共享的对象,否则锁不住(锁唯一)
  3. 再同步代码块或者同步函数中调用sleep方法不会释放锁对象,调用 wait方法是会释放对象的。

给个github follow me的链接,上面有很多初学者可供学习的资料,项目.

<a>https://github.com/SuperZee</a>

相关文章

  • 带你搞懂Java多线程(五)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四) ...

  • 带你搞懂Java多线程(六)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三)带你搞懂Java多线程(四)带...

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • java多线程--Callable

    **移步[java多线程系列文章]Java多线程(二十二)---LockSupport工具Java 停止线程 一、...

  • android 多线程 — 线程的面试题和答案

    这里都是我从各个地方找来的资料,鸣谢: Java多线程干货系列—(一)Java多线程基础 JAVA多线程和并发基础...

  • 5月份第一周学习安排

    学习内容: java多线程及线程同步的方法(使用) java多线程各种同步方法的原理和优缺点 java多线程设计模...

  • 带你搞懂Java多线程(四)

    带你搞懂Java多线程(一)带你搞懂Java多线程(二)带你搞懂Java多线程(三) 什么是线程间的协作 线程之间...

  • Java基础(六)

    多线程 Java多线程并发 1.1 JAVA 并发知识库 1.2 JAVA 线程实现/创建方式 1.2.1 继承 ...

  • (五) volatile关键字

    Java多线程目录 1 背景 理解Java多线程的内存抽象逻辑请阅读java多线程内存模型,当代操作系统,处理器为...

  • Java多线程高级特性(JDK8)

    [TOC] 一、Java多线程 1.Java多线程基础知识 Java 给多线程编程提供了内置的支持。一条线程指的是...

网友评论

      本文标题:java多线程

      本文链接:https://www.haomeiwen.com/subject/fddykttx.html