多线程并发就像是内功,框架都像是外功,内功不足,外功也难得精要.

1.进程和线程的区别

一个程序至少有一个进程,一个进程至少有一个线程.

用工厂来比喻就是,一个工厂可以生产不同种类的产品,操作系统就是工厂,产品就是进程,工人就是线程.

工厂----->操作系统

产品----->进程

工人---->线程

一个工厂可以同时生产不同的产品,即多个产品可以同时进行生产;

一种产品可以由多个工人协同工作,同样可以同时进行;

对应到操作系统的设计,因此可以归结为三点:

(1)以多进程形式,允许多个任务同时运行;

(2)以多线程形式,允许单个任务分成不同的部分运行;

(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

2.并发(concurrency)和并行(Parallel)的区别

并发和并行的区别是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务.

比喻:并发和并行的区别就是一个人同时吃三个馒头和三个人同时吃三个馒头

3.创建线程有哪几种方式?

1)创建线程方式一: 继承Thread类

子类覆盖父类中的run方法,将线程运行的代码存放在run中。
建立子类对象的同时线程也被创建。
通过调用start方法开启线程。

2)创建线程方式二: 实现Runnable接口

子类覆盖接口中的run方法。
通过Thread类创建线程,并将实现了Runnable接口的子类对象作为参数传递给Thread类的构造函数
Thread类对象调用start方法开启线程。

public static void main(String[] args) {
//方式1:
Thread thread = new Thread(){
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1:"+Thread.currentThread().getName());
}
}
};
thread.start(); //方式2:
Thread thread2 = new Thread(new Runnable() {
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("2:"+Thread.currentThread().getName());
}
}
});
thread2.start(); }

4.线程的四种状态

线程有四种状态,任何一个线程肯定处于这四种状态中的一种:

1) 被创建或新建(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没对它调用start()函数之前。

2) 运行或可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它。当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它;也可能它已正在执行。如执行了一个线程对象的start()方法后,线程就处于可执行状态,但显而易见的是此时线程不一定正在执行中。

3) 消亡或死亡(Dead):当一个线程正常结束,它便处于死亡状态。如一个线程的run()函数执行完毕后线程就进入死亡状态。

4) 冻结或停滞(Blocked):当一个线程处于停滞状态时,系统排程器就会忽略它,不对它进行排程。当处于停滞状态的线程重新回到可执行状态时,它有可能重新执行。如通过对一个线程调用wait()函数后,线程就进入停滞状态,只有当两次对该线程调用notify或notifyAll后它才能两次回到可执行状态。

5.线程中的计时器

计时器主要用于任务管理,在线程控制中占有很重要的地位,需要掌握.

1)第一次是在1秒后启动,然后每隔3秒循环启动一次

package com.amos.concurrent;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
* @ClassName: TraditionalTimerTest
* @Description: 传统的线程计时器
* @author: amosli
* @email:hi_amos@outlook.com
* @date Apr 17, 2014 12:54:32 AM
*/
public class TraditionalTimerTest {
public static void main(String[] args) {
new Timer().schedule(new TimerTask() {
@Override
public void run() {
System.out.println("timer...");
}
}, 1000, 3000); while (true) {
System.out.println(new Date().getSeconds());
try {
Thread.sleep(1000);
System.out.println("1000ms");
} catch (InterruptedException e) {
}
}
}
}

运行效果:

35
timer...
1000ms
36
1000ms
37
1000ms
38
timer...

2)每隔2秒每隔4秒间隔运行

package com.amos.concurrent;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
* @ClassName: TraditionalTimerTest
* @Description: 传统的线程计时器
* @author: amosli
* @email:hi_amos@outlook.com
* @date Apr 17, 2014 12:54:32 AM
*/
public class TraditionalTimerTest {
private static int count = 0 ;
@SuppressWarnings("deprecation")
public static void main(String[] args) {
//间隔2秒和4秒分开运行
class myTimerTask extends TimerTask{
@Override
public void run() {
count = (count+1)%2;
if(count==1){
System.out.println("mybombing_2000....");
new Timer().schedule(new myTimerTask(), 2000);
}else {
System.out.println("mybombing_4000....");
new Timer().schedule(new myTimerTask(), 4000);
}
}
}
new Timer().schedule(new TimerTask() {
@Override
public void run() {
new Timer().schedule(new myTimerTask(), 2000);
}
}, 2000);
//输出时间
while (true) {
System.out.println(new Date().getSeconds());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}

运行效果:

22
23
24
25
mybombing_2000....
26
27
mybombing_4000....
28
29
30
31
mybombing_2000....
32
33
mybombing_4000....
34
35
36
37

计时器的实现主要采用的是Timer类的.schedule()方法,默认的.schedule()方法中传入的是void java.util.Timer.schedule(TimerTask task, long delay),一个task,一个是延时操作;比较常用的是void java.util.Timer.sched(TimerTask task, long time, long period),period表示的是每隔一定时间进行循环执行task;当然这里还有定时操作void java.util.Timer.schedule(TimerTask task, Date time),这里要按实际需求去选择了.

java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器的更多相关文章

  1. Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

    1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...

  2. Java核心知识点学习----使用Condition控制线程通信

    一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...

  3. Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

  4. java核心知识点学习----重点学习线程池ThreadPool

    线程池是多线程学习中需要重点掌握的. 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互.在这种情形下,使用线程池可以很好的提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考 ...

  5. java核心知识点学习----多线程间的数据共享和对象独立,ThreadLocal详解

    线程内的数据共享与对象独立,举例:张三给李四转钱,开启A线程去执行转钱这个动作,刚好同时王五给赵六转钱,开启B线程去执行转钱,因为是调用的同样一个动作或者说对象,所以如果不能保证线程间的对象独立,那么 ...

  6. java核心知识点学习----equals和==的比较、单例模式,饿汉式,饱汉式

    最近发现自己学习能力变慢了,想来想去还是发现是因为自己Java基础没有打扎实,接下来的一系列文章将主要记录自己对于Java的最基础知识点的学习. 一.equals和==的比较 先看例子: packag ...

  7. Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger

    本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...

  8. Java核心知识点学习----线程中的Semaphore学习,公共厕所排队策略

    1.什么是Semaphore? A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each acq ...

  9. java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService

    前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...

随机推荐

  1. 在CentOS_RHEL 6上安装Metasploit的框架

    https://github.com/rapid7/metasploit-framework/wiki/Nightly-Installers 1. shyum update curl https:// ...

  2. Python 特殊语法:filter、map、reduce、lambda

    Python内置了一些特殊函数,这些函数很具python特性.可以让代码更加简洁. 可以看例子: 1 filter(function, sequence): str = ['a', 'b','c', ...

  3. Mabitis 多表查询(一)resultType=“java.util.hashMap”

    1.进行单表查询的时候,xml标签的写法如下 进行多表查询,且无确定返回类型时 xml标签写法如下: <select id="Volume" parameterType=&q ...

  4. arcgis server 10.2安装后,忘记Manager的用户名和密码

    arcgis server 10.2安装完毕后,需要创建站点,创建站点时,填写管理站点的用户名和密码.自己不小心,创建完毕后,给忘记了用户名和密码.求助Esri,解决方法如下: (1)找到arcgis ...

  5. 【AT91SAM3S】建立基于SAM3S库的工程并点亮LED

    习惯了ST的库,猛然间看到ATMEL的库,有点无从下手.这几天参考这示例工程,终于建立了一个使用ATMEl库的工程. 软件库版本: 软件平台:MDK470A 硬件平台:英蓓特 EB-SAM3S MCU ...

  6. 读CopyOnWriteArrayList有感

    除了加锁外,其实还有一种方式可以防止并发修改异常,这就是将读写分离技术(不是数据库上的). 先回顾一下一个常识: 1.JAVA中“=”操作只是将引用和某个对象关联,假如同时有一个线程将引用指向另外一个 ...

  7. git 服务器的搭建

    文章转载地址:http://www.linuxidc.com/Linux/2015-05/117502.htm 亲测可行,已经自己搭建一个正在使用中,搭建完成后,结合着pycharm +git,就能直 ...

  8. src与href属性的区别

    src和href之间存在区别,能混淆使用.src用于替换当前元素,href用于在当前文档和引用资源之间确立联系. src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在 ...

  9. 2017/1/8 C语言程序练习d

    有10个数按由小到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值.如果该数不在数组中,则打印出"无此数". 输入:-12 -8 12 24 45 ...

  10. PHP的命名空间

    简介: 防止名称冲突. 原理: 类似文件目录/usr/local这样的. 用法: namespace:定义命名空间: use:取别名: 代码示例:file 1.php <?php namespa ...