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

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获取。

												

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

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

    原文:http://blog.csdn.net/ghsau/article/details/17609747 JDK5.0之前传统线程        Java线程(一):线程安全与不安全 Java线程 ...

  2. Java线程专栏文章汇总

        转载自 http://blog.csdn.net/ghsau/article/details/17609747 JDK5.0之前传统线程        Java线程(一):线程安全与不安全 J ...

  3. java线程系列之三(线程协作)

    本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7433673,转载请注明. 上一篇讲述了线程的互斥(同步),但是在很多情况 ...

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

    本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield( ...

  5. Java面试知识点之线程篇(三)

    前言:这里继续对java线程相关知识点进行总结,不能间断. 1.yield()方法 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执 ...

  6. Java面试知识点之线程篇(二)

    前言:接上篇,这里继续对java线程相关知识点进行总结. 1.notify和notifyall的区别 notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的 ...

  7. Java面试知识点之线程篇(一)

    前言:在Java面试中,一定会遇到线程相关问题,因此笔者在这里总结Java中有关线程方面知识点,多数从网上得来(文中会贴出主要参考链接),有些也是笔者在面试中所遇到的问题,如有错误,请不吝指正.主要参 ...

  8. 8成以上的java线程状态图都画错了,看看这个-图解java并发第二篇

    本文作为图解java并发编程的第二篇,前一篇访问地址如下所示: 图解进程线程.互斥锁与信号量-看完还不懂你来打我 图形说明 在开始想写这篇文章之前,我去网上搜索了很多关于线程状态转换的图,我惊讶的发现 ...

  9. 深入浅出Java线程池:源码篇

    前言 在上一篇文章深入浅出Java线程池:理论篇中,已经介绍了什么是线程池以及基本的使用.(本来写作的思路是使用篇,但经网友建议后,感觉改为理论篇会更加合适).本文则深入线程池的源码,主要是介绍Thr ...

  10. Java线程池详解,看这篇就够了!

    构造一个线程池为什么需要几个参数?如果避免线程池出现OOM?Runnable和Callable的区别是什么?本文将对这些问题一一解答,同时还将给出使用线程池的常见场景和代码片段. 基础知识 Execu ...

随机推荐

  1. iOS 除去图片的白色背景(接近白色),或者其它颜色的替换,获取像素点的ARGB值

    iOS 除去图片的白色背景(接近白色),或者其它颜色的替换 方法如下: //去除图片的白色背景 + (UIImage*) imageToTransparent:(UIImage*) image { / ...

  2. iOS语音合成

    苹果公司在iOS7中推出了语音合成的技术,无需网络环境也可以实现语音合成. iOS7语音合成的主要的API如下: 1.AVSpeechUtterance,是语音合成的基本单位,它封装影响语音合成的需要 ...

  3. 分享一个java线程专栏

    专栏 : java线程基础 转载自 http://blog.csdn.net/column/details/yinwenjiethread.html 专栏内容: 1.线程基础:线程(1)--操作系统和 ...

  4. some words we should know

    2010年,芬兰艺术家Mikko Kuorinki做了一件独特的艺术品. 他在赫尔辛基的奇亚斯玛当代艺术博物馆(Kiasma museum),找了一堵墙,装了一个175 x 320cm的木架子,上面用 ...

  5. ArcGIS Server 10.2 实战(四)格栅动态配色服务

    当你的地理处理服务输出的是格栅,那个不可避免地需要为格栅的各类型数据添加不同色彩进行区分,而默认时格栅的色彩是随机的,或者固定死一套着色方案是也显得不够人性化,难以满足多样的客户需求,下面谈谈如何解决 ...

  6. IntelliJ IDEA使用之快捷键

    1. 自动完成代码 要完成代码 只需使用 Set<SSHConfig> sshConfigs = webConfig.getSshConfigs(); webConfig.getSshCo ...

  7. javaweb学习总结十五(web开发的相关概念以及常用服务器介绍)

    一:java web开发的相关概念 1:web分为静态web和动态web 2:模拟web服务器 web页面如果想让外部网络访问,必须通过网络程序读取资源,流程: a:用户通过浏览器访问网络程序 b:网 ...

  8. [BigData]关于Hadoop学习笔记第四天(PPT总结)(一)

    课程安排 Partitioner编程** 自定义排序编程** Combiner编程** 常见的MapReduce算法** ---------------------------加深拓展-------- ...

  9. 一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10(转)

     在网站开发中不免因为各种兼容问题苦恼,针对兼容问题,其实IE给出了解决方案Google也给出了解决方案百度也应用了这种方案去解决IE的兼容问题 百度源代码如下 <!Doctype html&g ...

  10. Hexo中添加emoji表情

    国庆的三天假前,都是玩CF和LOL的无限乱斗过来的,输了怨没随机到好的英雄,赢了就高高兴兴的