一 . 线程

java开启一个线程的方法(三种)

方法一:继承Thread类并New一个线程对象

步骤:

1):定义一个类A继承于Java.lang.Thread类。

class TestThread extends Thread

2):在A类中覆盖Thread类中的run方法。

3):在run方法中编写需要执行的操作。

4):在main方法中,创建线程对象,并启动线程。

//创建一个线程对象,并启动线程.
TestThread Lo = new TestThread();
Lo.start();  

注:不要调用run方法,如果调用run方法好比是对象调用方法,依然还是只有一个线程,并没有开启新的线程,正确开启一个线程的是应该调用其Star方法。

线程只能启动一次!

代码示例:

class TestThread extends Thread{
// 覆盖Thread类中的run方法.
public void run() {
System.out.println("阿龙");
}
} public class ThreadDemo {
public static void main(String[] args) {
// 主线程
System.out.println("运行游戏"+j); // 再创建一个线程对象,并启动线程.
TestThread Lo = new TestThread();
Lo.start();
}
}

方法二:实现Runnable接口(常用)

步骤:

1):定义一个类实现于java.lang.Runnable接口。

2):在该类中重写run方法。

3):重写run方法体内的操作。

4):在main方法中,创建线程对象,并启动线程。

代码示例:

//定义一个类继承于java.lang.Runnable接口
class Lo implements Runnable{
//重写Runnable接口中的run方法.
public void run() {
System.out.println("Yes~");
}
} public class Demo02 {
public static void main(String[] args) {
System.out.println("主线程"); //在main方法(线程)中,创建线程对象,并启动线程
Lo s = new Lo();
Thread t1 = new Thread(s);
t1.start();
}
}

方法三:实现Callable接口(不常用)

注:Callable接口实际上是属于Executor框架中的功能类,Callable接口与Runnable接口的功能类似,但提供了比Runnable更加强大的功能,如下:

1)Callable可以在任务结束的时候提供一个返回值,Runnable无法提供这个功能。

2)Callable的call方法分可以抛出异常,而Runnable的run方法不能抛出异常。

实现方法的步骤和runable差不多。

public class CallableAndFuture {
static class MyThread implements Callable<String> {
@Override
public String call() throws Exception {
return "Hello world";
}
} public static void main(String[] args) {
ExecutorService threadPool = Executors.newSingleThreadExecutor();
Future<String> future = threadPool.submit(new MyThread()); try {
System.out.println(future.get());
} catch (Exception e) { } finally {
threadPool.shutdown();
}
}
}

补充:

关于继承方式和实现方式的区别:

继承方式:
1):从设计上分析,Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了。

2):从操作上分析,继承方式更简单,获取线程名字也简单.(操作上,更简单)。

3):从多线程共享同一个资源上分析,继承方式不能做到。

实现方式:
 1):从设计上分析,Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口,设计更为合理。

2):从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用。

3):从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源)。

关于线程的常用方法。

1)

Thread.currentThead():获取当前线程对象

2)  - - (优先级):线程优先级高,被CPU调度的概率大,但不代表一定会运行,还有小概率运行优先级低的线程。

getPriority():获取当前线程的优先级

setPriority():设置当前线程的优先级

3) 

isAlive():判断线程是否处于活动状态 (线程调用start后,即处于活动状态)

4)

join():调用join方法的线程强制执行,其他线程处于阻塞状态,等该线程执行完后,其他线程再执行。有可能被外界中断产生InterruptedException 中断异常。比如:抢票软件的花钱买会员。

5)

sleep():在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。休眠的线程进入阻塞状态。

6)  

yield():调用yield方法的线程,会礼让其他线程先运行。(大概率其他线程先运行,小概率自己还会运行)- - 和join正好反义。

7)  

interrupt():中断线程

8)  - - (wait方法一般配合另外两个方法一起使用。涉及到一个加锁与释放锁的概念,同时我记得还用过CountDownLatch 门栓机制)

以下方法多用于处理多线程的并发问题,比如双十一抢货,春节抢票等场景。。

wait():导致线程等待,进入堵塞状态。该方法要在同步方法或者同步代码块中才使用的

notify():唤醒当前线程,进入运行状态。该方法要在同步方法或者同步代码块中才使用的

notifyAll():唤醒所有等待的线程。该方法要在同步方法或者同步代码块中才使用的

线程同步的代码示例

死锁问题

剩下的明天再写。。

关于多线程--网络编程 -- 注解反射的一点笔记(JAVA篇)的更多相关文章

  1. python多线程网络编程

    背景 使用过flask框架后,我对request这个全局实例非常感兴趣.它在客户端发起请求后会保存着所有的客户端数据,例如用户上传的表单或者文件等.那么在很多客户端发起请求时,服务器是怎么去区分不同的 ...

  2. 网络编程 --- URLConnection --- 读取服务器的数据 --- java

    使用URLConnection类获取服务器的数据 抽象类URLConnection表示一个指向指定URL资源的活动连接,它是java协议处理器机制的一部分. URL对象的openConnection( ...

  3. 大数据学习笔记——Java篇之网络编程基础

    Java网络编程学习笔记 1. 网络编程基础知识 1.1 网络分层图 网络分层分为两种模型:OSI模型以及TCP/IP网络模型,前者模型分为7层,是一个理论的,参考的模型:后者为实际应用的模型,具体对 ...

  4. python 多线程网络编程 ( 二 )

    背景 我在[第一篇文章中]已经介绍了如何实现一个多线程的todo应用,接下来我将会研究如何使这个服务器完成下面这几个功能. 1.使用正则表达式解析用户发送的请求数据: 2.使用ThreadLocal技 ...

  5. xml、网络编程、 反射

    XML 常用于配置文件.传输数据. <?xml version="1.0" encoding="UTF-8"?><persons> &l ...

  6. UNIX 网络编程第五章读书笔记

    刚看完 UNIX 第五章内容,我想按照自己的方式将自己获得的知识梳理一遍,以便日后查看!先贴上一段简单的 TCP 服务器端代码: #include <sys/socket.h> #incl ...

  7. UNIX网络编程卷2进程间通信读书笔记(一)—概述

    http://blog.chinaunix.net/uid-12868584-id-92807.html 写的灰常好,我就转载了 一.什么是进程间通信 IPC是进程间通信的简称,所谓进程通信,就是不同 ...

  8. 《Unix网络编程》卷2 读书笔记 第3章- System V IPC

    1. 概述 三种类型的System V IPC:System V 消息队列.System V 信号量.System V 共享内存区 System V IPC在访问它们的函数和内核为它们维护的信息上共享 ...

  9. 《Unix网络编程》卷2 读书笔记 第2章- Posix IPC

    1. 概述 Posix IPC 包括:Posix消息队列.Posix信号量.Posix共享内存区 Posix IPC在访问它们的函数和描述它们的信息上有一些类似点. 本章讲述所有这些共同属性:用于标识 ...

  10. 《Unix网络编程》卷2 读书笔记 第1章-简介

    1. 概述 2. 进程.线程与信息共享 Unix进程间的信息共享有多种方式:注意下图中内核的位置   左边的两个进程共享存留于文件系统中某个文件上的某些信息.为访问这些信息,每个进程都得穿越内核. 中 ...

随机推荐

  1. 递推 HDU 1143

    n%2==1 0 n%2==0 右边和左边没影响 右边的 * 左边的 z[n]=3*z[n-2]+2*z[n-4]+...2*z[0]; z[n-2]=3*z[n-4]+2*z[n-6]+...2*z ...

  2. BZOJ1407 [Noi2002]Savage

    Description Input 第1行为一个整数N(1<=N<=15),即野人的数目. 第2行到第N+1每行为三个整数Ci, Pi, Li表示每个野人所住的初始洞穴编号,每年走过的洞穴 ...

  3. Drupal 实战

    <Drupal 实战> 基本信息 作者: 葛红儒    丛书名: 实战系列 出版社:机械工业出版社 ISBN:9787111429999 上架时间:2013-6-28 出版日期:2013 ...

  4. springMVC3学习(四)--訪问静态文件如js,jpg,css

    假设你的DispatcherServlet拦截的是*.do这种URL.就不存在訪问不到静态资源的问题 假设你的DispatcherServlet拦截了"/"全部的请求,那同一时候对 ...

  5. Linux完全卸载Oracle的操作步骤

    卸载步骤如下:1.运行$ORACLE_HOME/bin/localconfig delete2.rm -rf $ORACLE_BASE/*3.rm -f /etc/oraInst.loc etc/or ...

  6. 问题解决--无法解析的外部符号 _imp_XXXXXXXXX

    错误示例: 出现字符_imp,说明不是真正的静态库,而是某个动态库的导入库,导入函数和自己不同名,所以加了字符_imp.比如说_imp_GetUserNameA就是GetUserNameA函数. 会报 ...

  7. 干了这杯Java之集合概览

    Java集合框架支持两种类型容器: 一种是为了存储一个元素的合集,为Collection 一种是为了存储键/值对,为Mapping Collection包含 Set存储不重复的元素 List存储一个有 ...

  8. 数据格式XML、JSON详解

    一. XML数据格式 1.1 XML的定义  扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类 ...

  9. Linux命令学习之路——档案拷贝:cp

    使用权限:所有角色 使用方式:cp [ -arf ] source dest / cp [ -arf ] source... Directory 作用:把一个档案拷贝到另一个档案(档案复制),或将多个 ...

  10. Aspose Linux下字体找不到报错

    http://www.aspose.com/docs/display/cellsnet/Smart+Markers http://www.aspose.com/docs/display/cellsja ...