搜档网
当前位置:搜档网 › 手把手教你做一个java线程池小例子

手把手教你做一个java线程池小例子

手把手教你做一个java线程池小例子
手把手教你做一个java线程池小例子

废话不多说开整

我用的是eclipse(这应该没多大影响)

建一个工程java工程和web工程都行然后建一个包建一个类带main方法

首先贴出来的是内部类

//继承了runnable接口

class MyTask implements Runnable {

private int taskNum;

public MyTask(int num) {

this.taskNum = num;

}

@Override

public void run() {

System.out.println("正在执行task "+taskNum);

try {

//写业务

Thread.currentThread().sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("task "+taskNum+"执行完毕!");

}

}

接下来就是这个类

public class testOne {

public static void main(String[] args) {

ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 7, 10, https://www.sodocs.net/doc/1318323740.html,LISECONDS, new ArrayBlockingQueue(2),new ThreadPoolExecutor.DiscardOldestPolicy() );

for(int i=0;i<15;i++){

MyTask myTask = new MyTask(i);

executor.execute(myTask);

System.out.println("线程池中线程数目:

"+executor.getPoolSize()+"队列等待执行的任务数目:"+

executor.getQueue().size()+"已经执行完别的任务数目:

"+executor.getCompletedTaskCount());

}

executor.shutdown();

}

}

接下来在说明一下ThreadPoolExecutor的参数设置ThreadPoolExecutor(int corePoolSize,//线程池维护线程的最少数量

int maximumPoolSize,//线程池维护线程的最大数量

long keepAliveTime,//线程池维护线程所允许的空闲时间

TimeUnit unit, 线程池维护线程所允许的空闲时间单位

BlockingQueue workQueue,线程池所使用的缓存队列

RejectedExecutionHandler handler线程池对拒绝任务的处理策略

)

handler有四个选择:

ThreadPoolExecutor.AbortPolicy()

抛出java.util.concurrent.RejectedExecutionException异常

ThreadPoolExecutor.CallerRunsPolicy()

重试添加当前的任务,他会自动重复调用execute()方法

ThreadPoolExecutor.DiscardOldestPolicy()

抛弃旧的任务

ThreadPoolExecutor.DiscardPolicy()

抛弃当前的任务

上面是一个例子接下来再来一个例子

建立一个类继承Runnable接口,大概是这样:

public class BelongTo2 implements Runnable {

@Override

public void run() {

try {

//当前线程休眠2秒当然也可以写业务

System.out.print("东西");

Thread.currentThread().sleep(2000);

System.out.print("\n");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

然后再

建立一个类带main方法,大概是这样:

public class Test2 {

public static void main(String[] args) {

//创建定长线程池大小为5

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

for(int i=0;i<20;i++){

BelongTo2 th=new BelongTo2();

fixedThreadPool.execute(th);

}

fixedThreadPool.shutdown();

}

}

运行就可以了。

简单介绍一下ExecutorService 这个类创建一个定长线程池,可控制线程最大并发数(后面的参数就是并发线程的数量),超出的线程会在队列中等待。

JAVA经典算法案例

JA V A经典算法40例 【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... public class exp2{ public static void main(String args[]){ int i=0; for(i=1;i<=20;i++) System.out.println(f(i)); } public static int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 或 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=1;i<=20;i++) System.out.println(mymath.f(i)); } } class math { public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=2;i<=200;i++) if(mymath.iszhishu(i)==true) System.out.println(i); } } class math { public boolean iszhishu(int x) { for(int i=2;i<=x/2;i++) if (x % i==0 ) return false; return true; } } 【程序3】题目:打印出所有的"水仙花数",所谓"水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水

论坛营销的整个操作流程

论坛营销的整个操作流程 论坛营销的发展 论坛营销伴随着论坛的产生而逐渐兴起和发展,论坛营销逐渐成为网络营销中不可或缺的一部分。随着互联网的发展,与网络营销推广相关的服务性网站也开始兴起。目前比较出名的网站有威客、携手网。 携手网在论坛营销一方面做的可谓比较完善,提供软文的写作以及软文的推广两项主要服务。携手网聚集了一大批专业的网络写手和网络推手,为企业、产品提供包装和推广。携手网的社区营销实现了系统自动审核的功能,从技术手段进一步提高了网络推广的质量,给商家带来切实的回报。 营销方向的定位 所谓营销方向的定位就是指你所要推广的企业或者产品是属于哪一个范畴的,众所周知论坛主要有两类一类是大而全的综合性论坛另一类是深而精的专业性论坛,每一个论坛都有它的发展方向和定位,即使是做横向发展的综合性论坛它也有它的重点版块。抓住这个论坛的主要用户群体与自己所推广的产品和服务相结合,研究一下你的信息在这个论坛上发布有没有价值,或者说有没有回报。 比如你做一个化妆品的营销推广,而在一个机械类论坛上去发布信息,那么所得到的回报会很小,但不能说没有,因为网络无处不在、网民的需求和层次也有多样性,不见得搞机械设计的不需要美容。但是呢为了达到我们营销的最佳效果获得最好的回报,还是要定位好自己的营销方向,找对投放信息的论坛。 论坛数据库的建立 定位好了自己的营销方向之后就要选择所要发布信息的论坛了,论坛数据库的建立是论坛营销的基础和前提,数据库建立的质量高低直接关系到论坛营销能否顺利开展。如果做专业的论坛推广,你不可能说注册一个论坛发一个帖子,一方面这样会降低工作的效率,另一方面许多论坛为了防灌水、防广告,对论坛注册以及发帖设置了重重限制,比如说注册时间少于1小时、2小时或者24小时不得发帖,注册用户的积分累计不到100不得发帖,注册必须进行邮箱验证等等。 所以建立论坛数据库是很必要的,一般而言数据库中的论坛所使用的用户名、密码以及注册时使用的邮箱需要保持一致,这也是为了方便后期的营销和推广,论坛数据所需要的信息包括论坛的名称、论坛的地址、论坛的分类、论坛的核心版块列表、论坛的活跃指数(也就是所说的论坛星级),这些信息都整理到一起之后进行营销推广的时候才能顺心顺手。 论坛营销软文 目前而言,论坛营销中最主要的方式就是营销软文的推广。顾名思义,它是相对于硬性广告而言,用唯美的语言将产品形象化,刺激阅读者的兴趣、进而产生消费的欲望。软文写作的目的就是要将企业的产品和形象通过美丽的文字来进行包装,以达到宣传的效果。软文写作的最高境界就是言之无物,实则有物。 软文目前已经成为企业或者产品营销推广中一种很实用的方式,通过营销软文可以达到做广告的效果和提高企业知名度和美誉度的目的。软文的硬效果就是要能卖货,即通过软文将企业的产品和服务卖出去。关于软文方面的知识很多也很繁杂,在这里只是简单的提一下。 写软文首先要选切入点,即如何把需要宣传的产品、服务或品牌等信息完美的嵌入文章内容。其次要设计文章结构,把握整体方向,控制文章走势,选好冲击力强的标题。还要完善整体文字,按框架丰富内容,润色具体内容。最后要反

java源代码经典入门案例—光环java编程培训机构

java源代码经典入门案例 class Demo { public static void main(String[] args) { System.out.println("hello E盘"); } } class Demo { public static void main(String[] args) { System.out.println("hello E盘"); } } /* 需求:练习一个hello world程序。 思路: 1,定义一个类,因为java程序都定义类中,java程序都是以类的形式存在的,类的形式其实就是一个字节码文件最终体现。 2,定义一个主函数。为了让该类可以独立运行。 3,因为演示hello world,在控制台上看到该字样,所以需要使用输出语句完成。 步骤: 1,用class关键字来完成类的定义,并起一个阅读性强的类名。 2,主函数:public static void main(String[] args)这时固定格式的。jvm认识。 3,使用输出语句:System.out.println("hello world"); 代码仅仅是思想的一种体现形式。 */ class Demo

{ //定义一个主函数,为了保证程序的独立运行。 public static void main(String[] args) { System.out.println("hello world");//这是输出语句,用于将括号中的数据打印到控制台上,ln可以在数据的结尾处换行。 } } class OperateDemo { public static void main(String[] args) { //算术运算符。+ - * / %(取余,模运算) +(连接符) // ++(自增:就在原有数据基础上+1,在赋给原有数据) -- //int x = 6370; //x = x / 1000 * 1000; //System.out.println(x); // System.out.println(5%2); // System.out.println(3+"2"); //System.out.println("5+5="+(5+5));//"5+5=5"+5 "5+5=55" //int a = 4,b = 5; //System.out.println("a="+a+",b="+b);//a=4,b=5; int a = 3,b; //a++;//a = a+1; // b = a++; b = (a++)+(++a)+(a++)+a; // 3 5 5 6 System.out.println("a="+a+",b="+b); int i = 3; i = i++;

Java经典编程题50道

【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 【程序3】 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如: 153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 【程序4】 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 【程序5】 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下 的用C表示。 1.程序分析:(a>b)?a:b这是条件运算符的基本例子。 【程序6】 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。 【程序7】 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析:利用while语句,条件为输入的字符不为'\n'. 【程序8】 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加), 几个数相加有键盘控制。 1.程序分析:关键是计算出每一项的值。 【程序9】

如何进行论坛社区营销推广

如何进行论坛社区营销推广 论坛社区营销是指网络营销人员寄宿在第三方论坛利用长期回答用户的提问,来建立自己在行业论坛中的信誉度以及地位,在推广个人的同时,更好的宣传自己的网站和产品,也是目前产品代理经销商最常用的营销方式。如何开展论坛社区营销推广? 以下几点共享: 1、选择什么样的论坛 这点是关系到论坛营销成效关键因素,通常我们需要找到行业内目标市场较为集中的行业论坛。通常论坛都是按照行业建立的,有的行业论坛涉及的研讨对象比较松散,有的就相对比较集中,此时当然是与自己产品越集中的主题论坛越好。当然该论坛必须驻扎着大量的用户,此点也是最重要的因素。例如自己网上买的是家电类产品,那么家电联盟是一个非常不错的选择,可以在里面选择最针对自己产品的主题进行长期驻扎的准备。 2、论坛营销并不是发广告 目前在国内不少的论坛上可以看到很多恶意发放的广告,需要注意的是这并不是论坛 营销。恶意在论坛上发放广告直接可以造成论坛用户对你的反感,一般比较细心的论坛管理员会直接禁止你的ID。 3、正确的论坛营销方式 通过长期回答第三方论坛用户的相关产品信息提问,久而久之在论坛建立了一定的人 脉关系,此时你如果想推广自己的产品就变的异常容易了,可以在个性签名里留下你的服务产品,以及你网站的网址链接或者联系方式。这时候你会发现很快就会有不错的效果,有的用户甚至直接打你的电话联系你购买产品。 4、论坛营销方式的优势所在 如果是一个在行业刚刚起步的公司或者个人,因为刚在这个行业中立足,难免缺乏长 久建立的人脉关系以及用户对你的信任度。此时论坛营销就是一个首选方式。往往所选择的行业论坛都是产品生产厂家或者相关人士长期苦心经营下来的,里面动辄着一定数量的用户。如果产品生产厂家比较重视网络营销这块的话,那么开设的一定有产品论坛,此论坛不是为

JAVA算法100例_全源码

JA V A经典算法40题 【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... public class exp2{ public static void main(String args[]){ int i=0; for(i=1;i<=20;i++) System.out.println(f(i)); } public static int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 或 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=1;i<=20;i++) System.out.println(mymath.f(i)); } } class math { public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=2;i<=200;i++) if(mymath.iszhishu(i)==true) System.out.println(i); } } class math { public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } public boolean iszhishu(int x) { for(int i=2;i<=x/2;i++) if (x % 2==0 ) return false; return true;

JAVA线程池原理333

在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。 线程池工作原理:

线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源不足。 线程池的替代方案 线程池远不是服务器应用程序内使用多线程的唯一方法。如同上面所提到的,有时,为每个新任务生成一个新线程是十分明智的。然而,如果任务创建过于频繁而任务的平均处理时间过短,那么为每个任务生成一个新线程将会导致性能问题。 另一个常见的线程模型是为某一类型的任务分配一个后台线程与任务队列。AWT 和 Swing 就使用这个模型,在这个模型中有一个 GUI 事件线程,导致用户界面发生变化的所有工作都必须在该线程中执行。然而,由于只有一个 AWT 线程,因此要在 AWT 线程中执行任务可能要花费相当长时间才能完成,这是不可取的。因此,Swing 应用程序经常需要额外的工作线程,用于运行时间很长的、同 UI 有关的任务。 每个任务对应一个线程方法和单个后台线程(single-background-thread)方法在某些情形下都工作得非常理想。每个任务一个线程方法在只有少量运行时间很长的任务时工作得十分好。而只要调度可预见性不是很重要,则单个后台线程方法就工作得十分好,如低优先级后台任务就是这种情况。然而,大多数服务器应用程序都是面向处理大量的短期任务或子任务,因此往往希望具有一种能够以低开销有效地处理这些任务的机制以及一些资源管理和定时可预见性的措施。线程池提供了这些优点。 工作队列 就线程池的实际实现方式而言,术语“线程池”有些使人误解,因为线程池“明显的”实现在大多数情形下并不一定产生我们希望的结果。术语“线程池”先于Java 平台出现,因此它可能是较少面向对象方法的产物。然而,该术语仍继续广泛应用着。 虽然我们可以轻易地实现一个线程池类,其中客户机类等待一个可用线程、将任务传递给该线程以便执行、然后在任务完成时将线程归还给池,但这种方法却存在几个潜在的负面影响。例如在池为空时,会发生什么呢?试图向池线程传递任务的调用者都会发现池为空,在调用者等待一个可用的池线程时,它的线程将阻塞。我们之所以要使用后台线程的原因之一常常是为了防止正在提交的线程被阻塞。完全堵住调用者,如在线程池的“明显的”实现的情况,可以杜绝我们试图解决的问题的发生。 我们通常想要的是同一组固定的工作线程相结合的工作队列,它使用 wait() 和

Java定时任务ScheduledThreadPoolExecutor

Timer计时器有管理任务延迟执行("如1000ms后执行任务")以及周期性执行("如每500ms执行一次该任务")。但是,Timer存在一些缺陷,因此你应该考虑使用ScheduledThreadPoolExecutor作为代替品,Timer对调度的支持是基于绝对时间,而不是相对时间的,由此任务对系统时钟的改变是敏感的;ScheduledThreadExecutor只支持相对时间。 Timer的另一个问题在于,如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以TimerTask抛出的未检查的异常会终止timer 线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被安排但尚未执行的TimerTask永远不会再执行了,新的任务也不能被调度了。 例子: packagecom.concurrent.basic; importjava.util.Timer; import java.util.TimerTask; public class TimerTest { private Timer timer = new Timer(); // 启动计时器 public void lanuchTimer() { timer.schedule(new TimerTask() { public void run() { throw new RuntimeException(); } }, 1000 * 3, 500); } // 向计时器添加一个任务 public void addOneTask() { timer.schedule(new TimerTask() { public void run() { System.out.println("hello world"); } }, 1000 * 1, 1000 * 5); }

论坛营销案例分析

论坛营销案例分析 案例介绍:五粮液的“结缘博友共赏美酒”主题活动,也很简单,就是五粮液通过博客发布活动信息,让其博客报名参与,再通过五粮液挑选幸运儿博主参加此次活动,分别寄送了其新产品国邑千红供博友品尝,博友们体验新产品后,纷纷在其博客上发表了对五粮液国邑千红的口味感受和评价,实现了超低成本而快速的推广目的。 案例分析:1.博客在搜索引擎的良好表现。按本质和定位上说,可以说博客是原创资讯的采集地,尤其受搜索引擎青睐,并且有较前的排名优势,因为博客文章都被视为客观而有价值的,而搜索引擎的排名规则正好也是这样,越是有价值的资讯就会越靠前推荐给网民。其次很多的资讯型网站转载收集内容,大多倾向于博客,尤其是那些专栏博客。2.博客营销的方式博客营销的方式有两条:一条是借题发挥,一条是链接回复。写博客需要思想,写营销博客就需要博客营销的思想。思想是不会从天下掉下来的,特别是博客营销还是一个新的事物,许多新的思想实际上并没有产生,已经产生的一些新的思想一般会有下面几个情况:一个是专家的研究,一个是自己在实践中的发现,一个是优秀博客的经验。专家在这方面的研究,是已经走在前面的东西,读了以后会受益匪浅。但是伊比沙认为,也需要看到:他们的研究结果,和实践是否一样,是需要补正的。伊比沙经常会固定去看一些专业性的网站,或者专家的博客,领会他们的观点。特别注意的是他们的一些与众不同的东西,有用的专业知识,很有趣的案例,以及有洞察力的分析。在欣赏他们的同时也会有自己一些思考。对于自

己在实践中的发现,要十分重视。它们可以随便拈来,就成为一个个小案例,比如一个发现,一个坚持在做的工作产生的效果,一个客户单子的完成,甚至一段对话等等。它们看来不显眼,但是是属于你自己的实践,是很新鲜的东西。3.找对方法和走对方向很重要,所谓找对方法就是适合自己的发展方式,并不是说什么高招之类,就等于一件衣服,谁都赞美漂亮好看,但是不是每个人穿都好看?我想未必,合身才是最好看的。 网络营销是借助一切被目标用户认可的网络应用服务平台开展的引导用户关注和产生兴趣的行为,以吸纳潜在用户、促进产品在线销售和延伸品牌影响力。以上是我自己给网络营销下的定义,如此定义未必准确但基本表达了核心意思。由概念我们可以很清楚的认识到,网络营销策略需要广度和深度:体现于“一切被目标用户认可的网络应用服务平台”,而深度体现于“引导用户关注的行为”;广度大小决定着所影响的目标用户数量;而深度高低决定着目标用户的接受度和转化率。 BBS营销 BBS营销注重营销广度,明显是以信息展示为主的Web1.0时代的网络营销方法。BBS营销方法是通过人工或软件将信息铺天盖地的发到BBS来从互联网海洋里抓虾,展现形式上过于直接而且注重吸纳的动作,属于“硬广告”;实际上BBS营销工作往往是通过群发软件来实现信息的发送,人工操作方式应用较少(因为成本高),这就造成传递

java经典案例与项目

Java学习的经典的案例收集 1:九九乘法表 /* 功能:实现九九乘法表的输出 时间:2013年7月4日 */ public class jiujiuchengfabiaoDemo { public static void main(String[] args) { for(int i=1;i<=9;i++){ for(int j=1;j<=i;j++){ System.out.print(j+"*"+i+"="+(i*j)+"\t"); } System.out.println(); } } } 结果: 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 2:输出等腰三角形 public class SanJiaoDemo { public static void main(String[] args) { for(int a=1;a<=5;a++){ for(int b=1;b<=5-a;b++){ System.out.print(" "); }

精选大厂java多线程面试题50题

Java多线程50题 1)什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。 2)线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。更多详细信息请点击这里。 3)如何在Java中实现线程? https://www.sodocs.net/doc/1318323740.html,ng.Thread类的实例就是一个线程但是它需要调用https://www.sodocs.net/doc/1318323740.html,ng.Runnable接口来执行,由于线程类本身就是调用的 Runnable接口所以你可以继承https://www.sodocs.net/doc/1318323740.html,ng.Thread类或者直接调用Runnable接口来重写run()方法实现线程。 4)Thread类中的start()和run()方法有什么区别? 这个问题经常被问到,但还是能从此区分出面试者对Java线程模型的理解程度。start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你

调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。 5)Java中Runnable和Callable有什么不同? Runnable和Callable都代表那些要在不同的线程中执行的任务。Runnable从JDK1.0开始就有了,Callable是在JDK1.5增加的。它们的主要区别是Callable的call()方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。 6)Java内存模型是什么? Java内存模型规定和指引Java程序在不同的内存架构、CPU 和操作系统间有确定性地行为。它在多线程的情况下尤其重要。 Java内存模型对一个线程所做的变动能被其它线程可见提供了保证,它们之间是先行发生关系。 ●线程内的代码能够按先后顺序执行,这被称为程序次序 规则。 ●对于同一个锁,一个解锁操作一定要发生在时间上后发 生的另一个锁定操作之前,也叫做管程锁定规则。 ●前一个对Volatile的写操作在后一个volatile的读操作之 前,也叫volatile变量规则。 ●一个线程内的任何操作必需在这个线程的start()调用之 后,也叫作线程启动规则。 ●一个线程的所有操作都会在线程终止之前,线程终止规

Java九大示例程序

JAVA面向对象九个经典例子程序 1 Hello world例子 (1) 2 类的基本组成示例 (1) 3静态与非静态变量及方法的使用 (3) 4 类继承的例子 (3) 5类的访问修饰符 (4) 6抽象类及其实现示例 (5) 7接口及其实现 (6) 8 抽象类与接口混合编程例子 (7) 9 接口回调与多态性 (8) 1 Hello world例子 package Example; //定义自己的包名 public class Example1 //定义一个类 { public static void main(String[] args) //系统可以执行的main方法,这里是一个公有静态无返回值的方法 { System.out.println("Hello world!"); //调用https://www.sodocs.net/doc/1318323740.html,ng包中的System类的PrintLine方法输出Hello world! } } 2 类的基本组成示例 package Example; class Person { public int age; //声明公共字段age private String name; //声明私有字段name,此时name为类的属性,下面通过公有方法进行访问 public String getName() { return name;

} public void setName(String name) { https://www.sodocs.net/doc/1318323740.html, = name; } public void eat() //定义无参数的eat方法 { System.out.println("Person can eat"); } public void eat(String s) //定义带参数的eat方法,实现方法重载 { System.out.println("Person can eat"+s); } public Person() //定义无参构造函数,注意无返回值定义,方法与类同名 { } public Person(int age, String name) //重写一个带参数构造函数,注意无返回值定义,方法与类同名 { this.age = age; //前一个age为对象的字段,由this指定,后一个age为函数形参 https://www.sodocs.net/doc/1318323740.html, = name; //前一个name为对象的属性,由this指定,因为在本类中可直接访问,后一个name为函数形参 } } public class Example2 { public static void main(String[] args) { Person person1 = new Person(); //调用类的无参构造函数 person1.age = 20; //给对象的公有字段直接赋值 person1.setName("zhangsan"); //必须使用公共方法才能给对象的属性赋值 System.out.println("第一个人信息,姓名:"+person1.getName()+"年 龄:"+person1.age); person1.eat(); //调用对象的无参方法 Person person2 = new Person(18, "lisi");//调用类的有参构造函数 System.out.println("第二个人信息,姓名:"+ person2.getName() + "年龄:"+ person2.age); person2.eat(" 馒头"); //调用对象的有参方法 } }

手把手教你做一个java线程池小例子

废话不多说开整 我用的是eclipse(这应该没多大影响) 建一个工程java工程和web工程都行然后建一个包建一个类带main方法 首先贴出来的是内部类 //继承了runnable接口 class MyTask implements Runnable { private int taskNum; public MyTask(int num) { this.taskNum = num; } @Override public void run() { System.out.println("正在执行task "+taskNum); try { //写业务 Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("task "+taskNum+"执行完毕!"); } } 接下来就是这个类 public class testOne { public static void main(String[] args) { ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 7, 10, https://www.sodocs.net/doc/1318323740.html,LISECONDS, new ArrayBlockingQueue(2),new ThreadPoolExecutor.DiscardOldestPolicy() );

for(int i=0;i<15;i++){ MyTask myTask = new MyTask(i); executor.execute(myTask); System.out.println("线程池中线程数目: "+executor.getPoolSize()+"队列等待执行的任务数目:"+ executor.getQueue().size()+"已经执行完别的任务数目: "+executor.getCompletedTaskCount()); } executor.shutdown(); } } 接下来在说明一下ThreadPoolExecutor的参数设置ThreadPoolExecutor(int corePoolSize,//线程池维护线程的最少数量 int maximumPoolSize,//线程池维护线程的最大数量 long keepAliveTime,//线程池维护线程所允许的空闲时间 TimeUnit unit, 线程池维护线程所允许的空闲时间单位 BlockingQueue workQueue,线程池所使用的缓存队列 RejectedExecutionHandler handler线程池对拒绝任务的处理策略 ) handler有四个选择: ThreadPoolExecutor.AbortPolicy() 抛出java.util.concurrent.RejectedExecutionException异常 ThreadPoolExecutor.CallerRunsPolicy() 重试添加当前的任务,他会自动重复调用execute()方法 ThreadPoolExecutor.DiscardOldestPolicy() 抛弃旧的任务 ThreadPoolExecutor.DiscardPolicy() 抛弃当前的任务 上面是一个例子接下来再来一个例子

论坛营销执行方案

论坛营销执行方案 一、论坛营销定位分析 目前中国最大,最火爆的论坛就是天涯和猫扑论坛,论坛营销的开展,将在这两个论坛中首先举行。天涯的人中多的是文艺青年和知识分子,他们的话题更多集中在社会生活和新闻时事。猫扑的人各种都有,话题不拘,有时候认真起来也不输天涯,猫扑更加随意,而天涯相对严谨点。按照年龄层来分,天涯参加工作有一定时间的人居多,猫扑是学生等年轻人比较多。 针对这两个论坛的定位,会有不同的营销方案。 二、推广内容 1.天涯的推广内容 由于天涯的受众大多是已经有一定阅历的社会人士,而且消费力比较强,所以很适合在这里推广比较高端的,智能手机,1000元以上的可以重点推广,例如 OT990M,OT-808,OT-807,OT-880D,安卓系列等。除此之外老年人手机也可在此推广,因为有社会能力的人有一定的孝敬父母的要求。 2.猫扑的推广内容 猫扑上面的人群比较年轻,消费力比较弱,所以可以重点推广1000元以下的机器,例如SIMPLE系列的,OT-990,OT-891,OT-800,OT-708,0T-710等。另外,猫扑的女性相对更多一点,说女性欢迎的话题这里更多一点。女性手机和智能手机也适合在这里推广。不过智能机在这里反而要推高端型号,学生比较喜欢机能强大的,高端的智能机型号。 三、论坛话题 a)天涯的人喜欢时政和社会事件,假如可以将一些软文包装成社会事件,在天涯里做营销, 效果会十分的大。 b)天涯的人习惯码字,习惯多字的贴子,所以纯文本的广告在这里可能反而有优势。 c)猫扑的人喜欢八卦和娱乐,在这里的论坛贴子风格要比较八卦,娱乐界的一些事件,如 果可以结合起来营销,效果会比较良好。一些贴子也可以写成八卦事来进行营销。 d)关于安卓系统,未来的手机是智能机的天下,作为目前市场占有率最高的,发展速度最 快的安卓系统,安卓系统的本身既可以成为话题。例如:什么类型的安卓机性价比高等。 e)利用阿尔卡特的悠久历史,以及其法国背景可以成为话题。例如:ALCATEL ONE TOUCH 是几时成立的?ALCATEL ONE TOUCH的设计有法国元素等。 f)通过ALCATEL ONE TOUCH的一些特色机型的特殊促销活动。例如:ALCATEL ONE TOUCH 与MISS SIXTY的合作机器,可以借MISS SIXTY 来炒作一番。还有王子版手机,施华洛世奇手机,淘宝大学定制机,化妆盒造型的特色手机,都可以借其历史,文化背景,

java递归的经典例子

java递归的经典例子 1。汉诺塔 这是递归的超经典的例子,几乎每本程序设计书上谈到递归都会介绍。具体情景不再赘述。以我上述的方法观之:(1)递归的出口在于disk数为一的时候(2)向出口逼近:如果不是一,是n ,则我们先挪动上面n-1块disk,等上面挪完,即递归返回的时候,我们挪动最底下的disk。 仅仅如此,一个貌似十分复杂的问题就解决了,因为挪动那n-1块disk的时候,会继续向上减少,直到disk的数量为一为止。下面给出java程序编码(已测试过,运行正常): import javax.swing.JOptionPane; public class Hanoi { private static final String DISK_B = "diskB"; private static final String DISK_C = "diskC"; private static final String DISK_A = "diskA"; static String from=DISK_A; static String to=DISK_C; static String mid=DISK_B; public static void main(String[] args) { String input=JOptionPane.showInputDialog("please input the number of the disks you want me move."); int num=Integer.parseInt(input); move(num,from,mid,to); } private static void move(int num, String from2, String mid2, String to2) { if(num==1){ System.out.println("move disk 1 from "+from2+" to "+to2); } else { move(num-1,from2,to2,mid2); System.out.println("move disk "+num+" from "+from2+" to "+to2); move(num-1,mid2,from2,to2); } } } 2。这是一个排列的例子,它所做的工作是将输入的一个字符串中的所有元素进行排序并输出,例如:你给出的参数是"abc" 则程序会输出:

java深入理解线程池

深入研究线程池 一.什么是线程池? 线程池就是以一个或多个线程[循环执行]多个应用逻辑的线程集合. 注意这里用了线程集合的概念是我生造的,目的是为了区分执行一批应用逻辑的多个线程和 线程组的区别.关于线程组的概念请参阅基础部分. 一般而言,线程池有以下几个部分: 1.完成主要任务的一个或多个线程. 2.用于调度管理的管理线程. 3.要求执行的任务队列. 那么如果一个线程循环执行一段代码是否是线程池? 如果极端而言,应该算,但实际上循环代码应该算上一个逻辑单元.我们说最最弱化的线程池 应该是循环执行多个逻辑单元.也就是有一批要执行的任务,这些任务被独立为多个不同的执行单元.比如: int x = 0; while(true){ x ++; } 这就不能说循环中执行多个逻辑单元,因为它只是简单地对循环外部的初始变量执行++操作. 而如果已经有一个队列 ArrayList al = new ArrayList(); for(int i=0;i<10000;i++){ al.add(new AClass()); } 然后在一个线程中执行: while(al.size() != 0){ AClass a = (AClass)al.remove(0); a.businessMethod(); } 我们说这个线程就是循环执行多个逻辑单元.可以说这个线程是弱化的线程池.我们习惯上把这些相对独立的逻辑单元称为任务. 二.为什么要创建线程池? 线程池属于对象池.所有对象池都具有一个非常重要的共性,就是为了最大程度复用对象.那么 线程池的最重要的特征也就是最大程度利用线程. 从编程模型模型上说讲,在处理多任务时,每个任务一个线程是非常好的模型.如果确实可以这么做我们将可以使用编程模型更清楚,更优化.但是在实际应用中,每个任务一个线程会使用系统限入"过度切换"和"过度开销"的泥潭. 打个比方,如果可能,生活中每个人一辆房车,上面有休息,娱乐,餐饮等生活措施.而且道路交道永远不堵车,那是多么美好的梦中王国啊.可是残酷的现实告诉我们,那是不可能的.不仅每个人一辆车需要无数多的社会资源,而且地球上所能容纳的车辆总数是有限制的. 首先,创建线程本身需要额外(相对于执行任务而必须的资源)的开销.

Java面向对象经典案例10个#(精选.)

1 class Anthropoid //类人猿 { private int n=100; void crySpeak(String s) { System.out.println(s); } } class People extends Anthropoid { void computer(int a,int b) { int c=a*b; System.out.println(c); } void crySpeak(String s) { System.out.println("**"+s+"**"); } } public class Monkey { public static void main(String args[]) { Anthropoid monkey=new People(); //monkey是People对象的上转型对象 //https://www.sodocs.net/doc/1318323740.html,puter(10,10); //非法 monkey.crySpeak("我喜欢这个运动"); People people=(People)monkey; //把上转型对象强制转化为子类的对象 https://www.sodocs.net/doc/1318323740.html,puter(10,10); } } 2

class ManyArea{ public double area(double radius){ return Math.PI*radius*radius; } public double area(double len,double width){ return len*width; } public double area(int len,int width){ return len*width; } public double area(double len,double width,double height){ return len*width*height; } } public class OverLoad{ public static void main(String args[]){ ManyArea ob=new ManyArea(); System.out.println("半径为3.0的圆的面积:"+ob.area(3.0)); System.out.println("长2.0、宽3.0的面积:"+ob.area(2.0,3.0)); System.out.println("长2、宽3的面积:"+ob.area(2,3)); System.out.println("立方体的面积:"+ob.area(2.0,3.0,4.0)); } } 3 class Animal { public void shout() { } } class Dog extends Animal { public void newDog() { System.out.println("Dog的新特性"); } public void shout() {

相关主题