1.进程与线程的区别

多个进程的内部数据和状态都是完全独立的,而多个线程是共享一块内存空间和一组系统资源,有可能互相影响。多线程程序比多进程程序需要更少的管理费用。进程是重量级的任务,需要分配他们的单独的地址空间。进程间通信是昂贵和受限的,进程间的切换也是很需要花费的。另一方面,线程是轻量级的选手,他们共享相同的地址空间并且共享同一个进程。线程间通信是便宜的,县城建的转化也是低成本的

线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。

比如:搬砖(一个进程),一个人搬,则是一个线程,是顺序执行的。五个人搬,则是五个线程。

2.什么是多线程

多线程是指在单个程序中可以同时运行不同的线程来执行的不同的任务。线程是程序内的顺序控制流,只能使用分配给程序的资源和环境。多线程的目的:最大限度的利用CPU。

例子:当程序启动运行时,就自动产生一个线程,主方法main就在这个主线程上面运行。

3.进程:执行中的程序(程序是静态的,进程是动态的),一个进程可以包含一个或者多个线程(Thread)。

4.线程的实现

在java中通过run方法为线程指明要完成的任务,有两种技术来为线程提供run方法。

1)集成Thread类并重写run方法,然后通过srart方法来启动线程,start方法首先为线程的执行准备好系统资源,然后调用run方法。当一个类集成了Thread类,就变成了一个线程

2)通过定义实现Runnable接口的类进而实现run方法,必须通过start方法来启动线程。

简单例子:

public class ThreadTest
{
public static void main(String[] args)
{
Thread1 t1 = new Thread1("first thread");
Thread1 t2 = new Thread1("second thread"); System.out.println(t1.getName());
System.out.println(t2.getName()); t1.start();
t2.start();
}
} class Thread1 extends Thread
{
public Thread1(String name)
{
super(name);
} @Override
public void run()
{
for(int i = 0; i < 100; i++)
{
System.out.println("hello world: " + i);
}
}
} class Thread2 extends Thread
{
public Thread2(String name)
{
super(name);
} @Override
public void run()
{
for(int i = 0; i < 100; i++)
{
System.out.println("welcome: " + i);
}
}
}

  

public class ThreadTest2
{
public static void main(String[] args)
{
// Thread t1 = new Thread(new Runnable()
// {
// @Override
// public void run()
// {
// for(int i = 0; i < 100; i++)
// {
// System.out.println("hello :" + i);
// }
// }
// });
//
// t1.start(); Thread t1 = new Thread(new MyThread()); t1.start(); Thread t2 = new Thread(new MyThread2()); t2.start(); }
} class MyThread implements Runnable
{
@Override
public void run()
{
for(int i = 0; i < 100; i++)
{
System.out.println("hello :" + i);
}
}
} class MyThread2 implements Runnable
{
@Override
public void run()
{
for(int i = 0; i < 100; i++)
{
System.out.println("welcome: " + i);
} }
}

  Thread 和 Runnable的区别

1.Thread类也实现了Runnable接口,因此实现了Runnable接口中的run方法。

2.当生成一个线程对象时,如果没有为其设定名字,那么线程对象的名字将使用如下形式:Thread-number

3.当使用Thread生成线程对象时,我们需要重写run方法,因为Thread类的run方法此时什么也不做

4.当使用Runnable实现线程对象时,需要实现Runnable接口中的run方法,然后使用new Thread(new MyThread())来生成线程对象,这时的线程对象的run方法就会调用Muthread类的run发放,这样就使用我们自己编写的run方法了 

线程的生命周期

1)创建状态

2)可运行状态

3)不可运行状态:sleep(long millis);线程调用wait方法等待特定条件的满足;线程输入、输出阻塞。

4)消亡状态

返回可运行状态条件:处于睡眠状态的线程在制定的时间过去后;如果线程在等待某一条件,另一个对象必须通过notify()或notifyAll()方法通知等待线程条件的改变;如果线程是因为输入/输出阻塞,等待输入/输出完成。

为什么要引入同步机制

在多线程环境中,可能会有两个甚至更多的线程试图访问一个有限的资源,必须对这种潜在资源冲突进行预防。

解决方法:在线程使用一个资源时为其加锁即可。访问资源的第一个线程为其加上锁后,其他线程便不能再使用那个资源,除非被解锁。

synchronized关键字:当synchronized关键字修改一个方法的时候,该方法叫做同步方法。

java中的每一个对象都有一个锁(lock)或者叫做监视器(monitor),当访问某个对象的synchronized方法时,表示将该对象上锁,此时其他任何线程都无法再次访问该synchronized方法了,直到之前的那个线程执行方法完毕后(或者抛出异常),那么将该对象的锁释放掉,其他线程才能有可能再去访问该synchronized方法。

 public class ThreadTest4
{
public static void main(String[] args)
{
Example example = new Example(); Thread t1 = new TheThread(example); example = new Example(); Thread t2 = new TheThread2(example); t1.start();
t2.start();
}
} class Example
{
public synchronized static void execute()
{
for(int i = 0; i < 20; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
} System.out.println("hello: " + i);
}
} public synchronized static void execute2()
{
for(int i = 0; i < 20; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
} System.out.println("world: " + i);
}
}
} class TheThread extends Thread
{
private Example example; public TheThread(Example example)
{
this.example = example;
} @Override
public void run()
{
this.example.execute();
}
} class TheThread2 extends Thread
{
private Example example; public TheThread2(Example example)
{
this.example = example;
} @Override
public void run()
{
this.example.execute2();
}
}

synchronized使用

java-线程(一)的更多相关文章

  1. Java线程并发:知识点

    Java线程并发:知识点   发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用.   逃逸:在对象尚未准备 ...

  2. Java线程的概念

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...

  3. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  4. 细说进程五种状态的生老病死——双胞胎兄弟Java线程

    java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...

  5. 【转载】 Java线程面试题 Top 50

    Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...

  6. 第24章 java线程(3)-线程的生命周期

    java线程(3)-线程的生命周期 1.两种生命周期流转图 ** 生命周期:**一个事物冲从出生的那一刻开始到最终死亡中间的过程 在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态 ...

  7. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  8. 第22章 java线程(2)-线程同步

    java线程(2)-线程同步 本节主要是在前面吃苹果的基础上发现问题,然后提出三种解决方式 1.线程不安全问题 什么叫线程不安全呢 即当多线程并发访问同一个资源对象的时候,可能出现不安全的问题 对于前 ...

  9. 第21章 java线程(1)-线程初步

    java线程(1)-线程初步 1.并行和并发 并行和并发是即相似又有区别: 并行:指两个或者多个事件在同一时刻点发生. 并发:指两个或多个事件在同一时间段内发生 在操作系统中,并发性是指在一段事件内宏 ...

  10. [转]Java线程安全总结

    最近想将java基础的一些东西都整理整理,写下来,这是对知识的总结,也是一种乐趣.已经拟好了提纲,大概分为这几个主题: java线程安全,java垃圾收集,java并发包详细介绍,java profi ...

随机推荐

  1. 为什么BT网络中迅雷的速度会这么快,比其它BT软件快

    先看迅雷加速通道的几个概论,参考:http://www.cnblogs.com/EasonJim/p/6608544.html 我个人理解,在传统BT软件中,基于P2P的网络是不具备以上条件去加速的, ...

  2. iOS--实时监控网络状态的改变

    在网络应用中,有的时候需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行智能处理,节省用户流量,提高用户体 ...

  3. MinGW在Windows环境下配合命令提示符运行C/C++

    http://jingyan.baidu.com/article/4853e1e5787d6b1909f726f8.html 在电脑中配置MinGW环境. 具体参见我的另一篇分享经验——MinGW在W ...

  4. 浅析 rand7生成rand10 方法 之 思想篇(一)

    [问题描写叙述] rand7是一个能生成1-7的随机数.要求利用rand7生成1-10的随机数. [算法思想] 1.组合数学方法 第1次 1 2 3 4 5 6 7 之中用rand7取一个数 第2次从 ...

  5. C中的预编译编译链接

        http://ke.qq.com/webcourse/index.html#course_id=67888&term_id=100058920&taid=13934591901 ...

  6. ollydbg快速定位方便调试

    在ollydbg调试的时候,会看到大量的汇编代码(远多于源代码),代码中有大量的函数嵌套调用,调试起来周期很长,难度比较大. 所以我们希望能快速定位到代码,以下是快速定位的四种方法: 1.Goto命令 ...

  7. js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式

    js replace 全局替换   js 的replace 默认替换只替换第一个匹配的字符,如果字符串有超过两个以上的对应字符就无法进行替换,这时候就要进行一点操作,进行全部替换. <scrip ...

  8. angular ui $modal 使用 option

    $modal是一个可以迅速创建模态窗口的服务,创建部分页,控制器,并关联他们 $modal仅有一个方法open(options) templateUrl:模态窗口的地址 template:用于显示ht ...

  9. caffe搭建--vs2015+caffe+python3.5编译环境的搭建

    修改build_win.cmd如下: @echo off @setlocal EnableDelayedExpansion :: Default values if DEFINED APPVEYOR ...

  10. 新一代AJAX API:FETCH

    AJAX半遮半掩的底层API是饱受诟病的一件事情. XMLHttpRequest 并不是专为Ajax而设计的. 虽然各种框架对 XHR 的封装已经足够好用, 但我们可以做得更好.更好用的API是 fe ...