java----线程篇

一个线程是进程内的一个单一的顺序控制流程图,多线程是指一个进程可以同时运行几个任务,每个任务由一个线程来完成。即多个线程可以同时运行,并且在一个进程内执行不同的任务。

1.创建线程两种方法方法一,

继承自Thread:

(1).定义一个类继承Thread类(2).覆盖Thread中的run()方法(3).直接创建Thread类的对象并测试线程。(4).调用线程的start方法,开启线程并调用线程的run方法并执行。

class Demo extends Thread{

    String name;
    Demo(String name){
        super(name);
        //this.name=name;
    }
    @Override
    public void run() {
        for(int i=0;i<10;i++){
            System.out.println(name+"................."+i+"......name="+Thread.currentThread().getName());
        }
    }
}

public class ThreadDemo {
    public static void main(String[] args) {
        //三个线程,主线程和其他俩个线程
        Demo d1=new Demo("xia");
        Demo d2=new Demo("里面");
        d1.start();
        d2.start();
        System.out.println("over======="+Thread.currentThread().getName());
    }
}

(程序结束,但是线程不一定结束。)

2.实现Runnable接口--------->将线程对象的任务从线程的子类中分离出来,进行单独的封装,按照面向对象的思想将任务封装成对象,避免的java的单继承。

(1).定义类实现Runnable接口(2).覆盖接口中的run方法,将线程的任务代码封装到run方法中(3).通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递(4).调用线程对象的start方法开启线程

class Ticket implements Runnable {
    private int num = 100;
    int j=0;
    public void run() {
        while (true) {
            synchronized (this) {
            if (num > 0){
                    j++;
                    //Thread.currentThread().getName()是获取当前线程的名字,Thread-编号,其中编号是从0开始的。
                    System.out.println(j+"==="+Thread.currentThread().getName() + "-----------" + num--);
                }
            else
                break;
            }
        }
    }
}

public class ThreadDemo1 {
    public static void main(String[] args) {
        Ticket t = new Ticket();
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);
        Thread t4 = new Thread(t);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}   

run()方法:run方法中定义的就是线程要运行的任务代码,开启线程是为了运行指定代码,所有只有继承了Thread类,复写run方法,将运行的代码定义到run方法中进行

2.线程的同步问题

线程的安全产生的原因:多个线程在操作共享的数据,或,操作共享数据的线程代码有多条

当线程在执行共享操作共享数据的多条代码,其他线程参与运算就会导致线程安全问题的产生。

线程同步的处理方式:

创建同步方法:

package my1.exa.dao;

class Bank{
    private int sum;
    synchronized void add(int money){
        sum=sum+money;
        System.out.println(sum);
    }
}

class Costum implements Runnable{

    Bank b=new Bank();
    @Override
    public void run() {
        for(int i=0;i<3;i++){
            b.add(100);
        }
    }

}

public class SyncThreadDemo {
    public static void main(String[] args) {
        Costum co=new Costum();
        Thread th1=new Thread(co);
        Thread th2=new Thread(co);
        th1.start();
        th2.start();
    }
}

创建同步代码块:

class Ticket1 implements Runnable {

    private static  int num = 100;
    Object ob=new Object();
    public void run() {
        while (true) {
          synchronized (ob) {
              if (num > 0){
                 System.out.println(Thread.currentThread().getName() + "------obj-----" + num--);
              }
          }
        }
    }
}

public class SynFuncationLockDemo {
    public static void main(String[] args) throws InterruptedException {
        Ticket1 tm = new Ticket1();
        Thread t1=new  Thread(tm);
        Thread t2=new  Thread(tm);
        t1.start();
        t2.start();
    }
}

同步函数中使用的锁是this 同步函数和同步代码块的区别是:同步函数的锁是固定的this,同步代码块中的锁是任意的对象

静态同步函数中使用的同步锁是该函数所属的字节码文件对象,用getClass方法获取,或者用当前类名.class获取。

				
时间: 2024-08-23 10:54:10

java----线程篇的相关文章

Java线程专栏文章汇总(转)

原文:http://blog.csdn.net/ghsau/article/details/17609747 JDK5.0之前传统线程        Java线程(一):线程安全与不安全 Java线程(二):线程同步synchronized和volatile Java线程(三):线程协作-生产者/消费者问题 Java线程(四):线程中断.线程让步.线程睡眠.线程合并 Java线程(五):Timer和TimerTask JDK5.0之后并发包        Java线程(六):线程池 Java线程

Java线程专栏文章汇总

JDK5.0之前传统线程        Java线程(一):线程安全与不安全 Java线程(二):线程同步synchronized和volatile Java线程(三):线程协作-生产者/消费者问题 Java线程(四):线程中断.线程让步.线程睡眠.线程合并 Java线程(五):Timer和TimerTask JDK5.0之后并发包        Java线程(六):线程池 Java线程(七):Callable和Future Java线程(八):锁对象Lock-同步问题更完美的处理方式 Java

JAVA技术专题综述之线程篇(1)

本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:synchronized 本文将对以上内容进行讲解. 一:run()和start() 示例1: public cla ThreadTest extends Thread{public void run(){for(int i=0;i<10;i++){Syste

JAVA学习篇--ThreadLocal,Java中特殊的线程绑定机制

在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个connection连接).那么ThreadLocal是如果做到的呢?它和同步锁的不同在哪里? 是什么: 对于ThreadLocal看英文单词我们很容易理解为一个线程的本地实现,但是它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLoc

JAVA基础篇七(Java,C++中的线程)

讲到线程,Java的线程目前只知道从thread继承,并用start函数启动线程,稍后会多了解JAVA线程相关知识,补充到这一章中. C++的线程在读硕期间用到过多次,下面首先总结一下: 1.C++线程 (1)MFC多线程 这种方式我没用过,所以这里只是提一下,主要在MFC中,一般用全局函数AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用于创建工作者线程和用户界面线程. (2)phtread POSIX线程(POSIX threads),简称Pthrea

适用于即时系统并发编程的新的java线程模型,记我的第一篇英文翻译

1:介绍:      传统意义上的即时系统是有经验的专家的领域,因为他们能处理多种定制的内核,非标准的并且大多数是低级的语言,供应商提供的定制的I/O接口.这就要求有一种新的java线程模型来解决这种状况,这种模型解决当前及时嵌入系统的四个缺陷:安全,性能,可移植性.程序调试时间.安全是当前编程语言和及时系统在复杂性与定义不清的接口上折中的办法,这些语法不能成为正式的保证系统安全的语法:性能受到威胁是因为工程师必须接受及时系统所提供的无论什么级别的操作,如果那些操作过高或过低都会导致非必要的日常

Java线程入门第一篇

Java线程的状态有6种 1.  初始(NEW):新创建了一个线程对象,但还没有调用start()方法. 2.  运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为"运行".(什么是就绪) 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法.该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready).(什么是运行)就绪状态的线程在获得CPU时间片后变为运行中状态(

java 线程详解

5月7号  周末看了一下线程方面的内容 ,边看视频边看书还附带着参考了很多人的博客,一天的收获,写下来整理一下:感觉收获还是挺多的:过段时间可能看完java  这几大块要去看一下关于spring boot  的内容顺便  也整理一下:附上我参考的 几本书: 关于java  线程,首先要了解一下线程和进程之间的关系.区别以及他们之间的概念: 首先是线程: 什么是线程? 线程是在程序执行过程中能够执行部分代码的一个执行单元,也看看做是一个轻量级的进程:线程是程序内的程序控制流只能使用程序内分配给程序

Java总结篇系列:java.lang.Object

从本篇开始,将对Java中各知识点进行一次具体总结,以便对以往的Java知识进行一次回顾,同时在总结的过程中加深对Java的理解. Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java中最基本的类java.lang.Object开始谈起. Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起.作为其他所有类的基类,Object具有哪些属性和行为, 是Java语言设计背后的思维体现. Object类位于java.lang包中,java.lang包包

Java线程经典面试题

53道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并